0

char[] から整数を取得する際に問題が発生しています。私は非常に単純なコード行ですが、どこに問題があるのか​​ わかりません。
これはコードです:

char* rawd = .....
int resultSize = ((int*)rawd)[0];

cout << "BYTES ::: " << (int)(rawd[0]) << " " << (int)(rawd[1]) << " " << (int)(rawd[2]) << " " << (int)(rawd[3]) << endl;
cout << "SIZE RETURNED :::::: " << resultSize << endl;

これは印刷されるものです:

BYTES ::: 0 0 4 0
SIZE RETURNED :::::: 262144

そして、私はresultSize1024年になると予想しています。

resultSize1024 ではなく 262144 が含まれているのはなぜですか?

4

2 に答える 2

3

68000 シリーズのような「ビッグ エンディアン」プロセッサを搭載したマシンでは、期待どおりの変換が得られます。Intel プロセッサ (「リトル エンディアン」マシン) では、バイト順が逆になり、期待どおりの結果が得られます。

int生のメモリ バイトを、 などのデータ型に変換するdoubleのは難しく、データが別のマシンからのものである可能性がある場合は、非常に注意が必要です。ホスト固有の順序とビッグエンディアンである標準の「ネットワーク順序」との間で変換を行うntohs()ntohl()htons()、 と呼ばれる準標準関数があります。htonl()これらの関数は、すべての UNIX ライクなシステムと一部の Windows C ライブラリでも利用できます。

于 2012-05-07T03:16:43.197 に答える
2

どうやらあなたのシステムはビッグエンディアンです。これは、より大きな整数の最下位バイトがより大きなアドレスにあり、最上位バイトがより低いアドレスにあることを意味します。

リトルエンディアンの結果は、0 + 4*256 + 0*256 2 + 0*256 3 = 1024になります。

ビッグエンディアンの結果は、0 + 0*256 + 4*256 2 + 0*256 3 = 262144になります。

于 2012-05-07T03:18:37.750 に答える