cocos2dx中直接从二进制流数据读取tmx文件长度不一致

		unsigned long len = 0;
		char* pBuffer = (char*)CCFileUtils::sharedFileUtils()->getFileData("map.tmx", "rt", &len);
		CCTMXTiledMap* cme=CCTMXTiledMap::createWithXML(pBuffer,NULL);

用这种方法创建tmx地图可能会失败,跟踪调试进取看到,在解析xml中

int result = xmlSAXUserParseMemory( &saxHandler, this, pXMLData, uDataLength );(在bool CCSAXParser::parse(const char* pXMLData, unsigned int uDataLength)这个函数中)
uDataLength 长度跟最初len上面的不一样,uDataLength 是使用strlen获取pBuffer的长度
bool CCTMXMapInfo::parseXMLString(const char *xmlString)
{
    int len = strlen(xmlString);
    if (xmlString == NULL || len <= 0) 
    {
        return false;
    }

    CCSAXParser parser;

    if (false == parser.init("UTF-8") )
    {
        return false;
    }

    parser.setDelegator(this);

    return parser.parse(xmlString, len);
}

 CCFileUtils::sharedFileUtils()->getFileData是使用fread获取pBuffer的长度. 

   VS调试查看内存,看到

 

 如上图,fread是以EOF为标志结束的,即0x0a,而strlen是以00为结束位的.所以造成内存不一样.本来在0a处就停止,但strlen会直到00才会结束.

 只要加上

pBuffer[len-1]=0;
就可以上strlen正确读取长度

  


cocos2d-x的版本是cocos2d-2.1beta3-x-2.1.1
原文地址:https://www.cnblogs.com/lihaibo19891007/p/2984389.html