cocos2d-xでc配列をvalueMapに保存
https://github.com/noprops/RRGCodingAndCrypto
cocos2d-x v3で使える、NSCodingのようなライブラリを作っているのですが、
c配列を扱う時に、問題が生じています。
c配列をエンコードする際には、
archiver->encodeArray<int>(_intArray,size,"key");
として、arrayをcocos2d::Dataにコピーし、
そのデータをbase64encodeしてvalueMapに入れて保存しています。
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);
}
}
arrayのサイズが小さい時にはこのやり方でできるのですが、
サイズが70以上など大きくなると、decodeの時にうまくいきません。
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;
}
"encodedData ="
"decodedDataLen = 0"
"data is null."
と表示されます。
valueMapの中からデータは取り出せるのですが、
なぜか中身がなくなっています。
どなたか解決方法がわかりましたら、教えてください。
または、c配列を保存するもっといいやり方があれば、教えてください。
よろしくお願い致します。