cocos2d-x中直接从二进制流数据读取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