20785


<https://github.com/noprops/RRGCodingAndCrypto>  
cocos2d-x v3で使える、NSCodingのようなライブラリを作っているのですが、  
c配列を扱う時に、問題が生じています。  
c配列をエンコードする際には、

[code]

    archiver->encodeArray<int>(_intArray,size,"key");
    
[/code]

として、arrayをcocos2d::Dataにコピーし、  
そのデータをbase64encodeしてvalueMapに入れて保存しています。

[code]

    template <typename T>
    void Encoder::encodeArray(T* array, int size, const std::string& key)
    {
        cocos2d::Data data;
        data.copy((unsigned char*)array, sizeof(T) * size);
        encodeData(data, key);
    }
    void Encoder::encodeData(const Data& data, const string& key)
    {
        char* encodedData = nullptr;
        base64Encode(data.getBytes(),
                     static_cast<unsigned int>(data.getSize()),
                     &encodedData);
        _valueMap[key] = encodedData;
        if (encodedData) {
            free(encodedData);
        }
    }
    
[/code]

arrayのサイズが小さい時にはこのやり方でできるのですが、  
サイズが70以上など大きくなると、decodeの時にうまくいきません。

[code]

    Data Decoder::decodeData(const string& key)
    {
        if (_valueMap.find(key) == _valueMap.end()) {
            return Data::Null;
        }
    
        const char* encodedData = _valueMap.at(key).asString().c_str();
        CCLOG("encodedData = %s", encodedData);
        //"encodedData ="と表示
        unsigned char* decodedData = nullptr;
        int decodedDataLen = base64Decode((unsigned char*)encodedData,
                                          (unsigned int)strlen(encodedData),
                                          &decodedData);
        CCLOG("decodedDataLen = %d", decodedDataLen);
        //"decodedDataLen = 0"と表示
        if (decodedData) {
            Data data;
            data.fastSet(decodedData, decodedDataLen);
            return data;
        } else {
            return Data::Null;
        }
    }
    
    template <typename T>
    T* Decoder::decodeArray(const std::string& key)
    {
        //CCLOG("%s", __PRETTY_FUNCTION__);
        cocos2d::Data data = decodeData(key);
        if (data.isNull()) {
            CCLOG("data is null.");
            return nullptr;
        }
        ssize_t size = data.getSize();
        T* array = new T[size];
        memcpy(array, data.getBytes(), size);
        return array;
    }
    
[/code]

"encodedData ="  
"decodedDataLen = 0"  
"data is null."  
と表示されます。  
valueMapの中からデータは取り出せるのですが、  
なぜか中身がなくなっています。

どなたか解決方法がわかりましたら、教えてください。  
または、c配列を保存するもっといいやり方があれば、教えてください。  
よろしくお願い致します。


CC BY-SA 3.0
2016-01-08T08:19:58.440
20745
2016-01-09T14:01:28.887
2016-01-08T15:38:31.767
8000
8825
question
c++ cocos2d-x
cocos2d-xでc配列をvalueMapに保存


コメントしていただいた方ありがとうございました。

[code]

    //const char* encodedData = _valueMap.at(key).asString().c_str();
    string str = _valueMap.at(key).asString();
    const char* encodedData = str.c_str();
    
[/code]

指摘していただいた箇所を直したらうまくいきました。


CC BY-SA 3.0
2016-01-09T14:01:28.887
20785
2016-01-09T14:01:28.887
8825
20745
answer