Memcpy从char *缓冲区到wchar_t *缓冲区

时间:2012-10-07 04:02:53

标签: c++

基本上我有

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是一个字节数。

1 个答案:

答案 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