-2

基本上我有

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 - 要跟随的字符串的大小

0032002E0030002F00530065007200610074006F002000530063007200610074006300680020004C004900560045002000440061007400610065字符串-2006100730

该字符串每个字符使用 16 个字节,因此我不能将 char * 用于实际字符串,wchar_t 似乎是最好的选择。

但是,当我将这些字节存储到 wchar_t 时,我在 cout 中得到 0x7fe7abc037e0,我认为这是一个指针?

这似乎是错误的。当我使用 wcout 时,我在终端中什么也得不到。

memcpy 不会为此工作吗?

我的 wchar_t 大小也应该减半,因为我的 wchar_t 数量只有我拥有的字符的一半吗?

size 是字节数。

4

1 回答 1

2

您的字符串看起来像是大端顺序,但您(可能)使用的是小端机器。因此,您的wchar_t字符串中充满了诸如 U+3200 之类的字符,您的终端可能无法正确打印这些字符。

您将必须正确翻转这些字符中的每一个。您最好的选择是将输入视为 aunsigned 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.

于 2012-10-07T04:18:05.297 回答