zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    打开LogCat以便查看日志
    sql语句优化
    IIS部署说明
    VM上Hadoop3.1伪分布式模式搭建
    C# 程序结构
    CSS笔记1:属性定位
    VS2013 添加控制台程序
    布局 Layout
    [游泳] 游泳学习课程
    "12306"台前幕后:五年利益之争 仓促上线
  • 原文地址:https://www.cnblogs.com/lihaibo19891007/p/2984389.html
Copyright © 2011-2022 走看看