-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-従う文字列のサイズ

0032002E0030002F00530065007200610074006F002000530063007200610074006300680020004C004900560045002000440061007400610062006100730065-文字列

文字列は1文字あたり16バイトを使用するため、実際の文字列にchar *を使用することはできません。これは、wchar_tが最善の策のようです。

ただし、これらのバイトをwchar_tにmemcpyすると、coutで0x7fe7abc037e0が取得されます。これは、ポインターであると想定していますか?

これは間違っているようです。wcoutを使用すると、ターミナルに何も表示されません。

memcpyはこれでは機能しませんか?

また、wchar_tの数はcharの半分しかないため、wchar_tのサイズを半分にする必要がありますか?

サイズはバイトカウントです。

4

1 に答える 1

2

文字列はビッグエンディアンの順序になっているように見えますが、(おそらく)リトルエンディアンのマシンを使用しています。したがって、wchar_t文字列はU + 3200のような文字でいっぱいであり、端末が正しく印刷されない可能性があります。

これらの文字をすべて適切に反転させる必要があります。最善の策は、入力をaとして扱い、正しいエンディアン反転を使用しunsigned char *て要素を一度に1つずつコピーすることです。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_t16ビット幅であると想定できないことに注意してください。C ++ 11機能を使用できる場合は、を使用してchar16_tください。

于 2012-10-07T04:18:05.297 に答える