0

私は次のように定義された関数を持っています:

void AddHeadCode(std::ofstream &ostream, size_t length){
ostream.write((char*)length, sizeof(length));
ostream.seekp(0x10L, std::ios::beg);
}

これが実行されると、明らかに失敗します... char ポインターがどこにもポイントしないためです。しかし、ファイルに書き込まれた実際のポインタ値が必要です。長さ = 19152 のように、HEX エディタでファイルを開くと、そこに 0d4a が見つかるはずです。

これはC ++でどのように達成できますか? 私はここでちょっと迷っています...

4

2 に答える 2

5

変数のアドレスを取得し、lengthそのアドレスをに渡します.write

void AddHeadCode(std::ofstream &ostream, size_t length){
  // by popular demand, removed C-style cast
  ostream.write(reinterpret_cast<char*>(&length), sizeof(length));
  ostream.seekp(0x10L, std::ios::beg);
}

ただし、これは通常、整数を「16 進数として」書き込むとは呼ばれません。これは、整数を「バイナリとして」書き込む、または単に整数を書き込むと呼ばれることがあります。

あなたが行ったことは、移植可能な実践ではないことに注意してください。別のコンピューター (または同じコンピューターでも別のコンパイラーを使用) で値を再度読み取った場合、同じ値を読み取れない場合があります。

于 2012-04-05T14:52:46.997 に答える
0

ファイルストリームはトリッキーなので、私はそれについて確信が持てませんが、私はこれを文字列ストリームに使用します:

std::basic_stringstream<wchar_t> oTmpStream;
oTmpStream << L"0x" << std::nouppercase << std::setfill( L'0' ) << std::hex << std::setw( 8 ) << iSomeValue

// or without fancy formatting;
oTmpStream << std::hex <<  iSomeValue
于 2012-04-05T14:58:03.560 に答える