基本上我有
void FileReader::parseBuffer(char * buffer, int length)
{
//start by looking for a vrsn
//Header seek around for a vrns followed by 32 bit size descriptor
//read 32 bits at a time
int cursor = 0;
char vrsn[5] = "vrsn";
cursor = this->searchForMarker(cursor, length, vrsn, buffer);
int32_t size = this->getObjectSizeForMarker(cursor, length, buffer);
cursor = cursor + 8; //advance cursor past marker and size
wchar_t *version = this->getObjectForSizeAndCursor(size, cursor, buffer);
cout << version << "\n";
delete[] version;
}
wchar_t* FileReader::getObjectForSizeAndCursor(int32_t size, int cursor, char *buffer) {
wchar_t *destination = NULL;
destination = new wchar_t[(size/2)+1];
memcpy(destination, buffer + cursor, size);
return destination;
}
在我的例子中说我有以下字节
7672736E - 标记vrsn
00000040 - 要遵循的字符串大小
0032002E0030002F00530065007200610074006F002000530063007200610074006300680020004C004900560045002000440061007400610062006100730065 - string
字符串每个字符使用16个字节,所以我不能使用char *作为实际字符串,wchar_t似乎是最好的选择。
然而,当我将这些字节记忆到wchar_t时,我在cout中得到0x7fe7abc037e0,我认为是指针?
这似乎不对。当我使用wcout时,我终于得不到任何东西。
memcpy对此不起作用吗?
我的wchar_t大小也应该减半,因为我只有一半的wchar_t和我的chars一样多吗?
size是一个字节数。
答案 0 :(得分:2)
你的字符串看起来像是大端序,但你(可能)使用的是小端机器。因此,您的wchar_t
字符串中充满了U + 3200这样的字符,您的终端可能无法正确打印出来。
您必须正确翻转每个角色。您最好的选择是将输入视为unsigned char *
,并将元素一次一个地复制到wchar_t *
中并使用正确的字节序逆转:
int wlen = size/2;
uint16_t *dest = new uint16_t[wlen + 1];
unsigned char *ptr = (unsigned char *)(buffer + cursor);
for(int i=0; i<wlen; i++) {
dest[i] = (ptr[0] << 8) + ptr[1];
ptr += 2;
}
dest[wlen] = 0;
return dest;
请注意,您不能假设wchar_t
是16位宽。如果您可以使用C ++ 11功能,请使用char16_t
。