hexdumpと実際のファイルの内容


16

するとhexdump filename.txt、出力として次のものが得られます。

00000000 ac5a 5afb c08d 5d15 26d0 2491 e8c9 8917
00000010 

私が行うと<?= bin2hex(file_get_contents('filename.txt')); ?>、私はこれを取得します:

5aacfb5a8dc0155dd0269124c9e81789

では、なぜhexdumpはac5a5afbc08d5d1526d02491e8c98917、PHPが本来あるべきだと示唆しているときに、内容があるべきだと示唆しているの5aacfb5a8dc0155dd0269124c9e81789でしょうか?hexdumpの出力を正しく解釈していないだけですか?


回答:


24

違いはビッグエンディアンとリトルエンディアンの順序です。

hexdump出力の最初の4バイトから始めます ac5a 5afb。次に、バイト順を切り替えて取得します。

5aac fb5a

これをPHP出力と比較します。

5aac fb5a

彼らは一致します。

デフォルトでは、BSD hexdumpはマシンのエンディアンに基づいて出力を表示します。それが望ましくない場合-Cは、ワード単位ではなくバイト単位で出力を取得するオプションを指定できます。

$ hexdump filename.txt 
0000000 ac5a 5afb c08d 5d15 26d0 2491 e8c9 8917
0000010
$ hexdump -C filename.txt 
00000000  5a ac fb 5a 8d c0 15 5d  d0 26 91 24 c9 e8 17 89  |Z..Z...].&.$....|
00000010

4
ビットを追加するには:hexdumpは、16ビットワードとして解釈されるデータを表示しています。ASCII文字などに適しているように、bin2hexは一度に1バイトを表示しています。x86およびx64(およびその他のリトルエンディアンCPU)では、マルチバイト整数の最初のバイトに最下位ビットが含まれています。ファイルの最初のものが値1を含む16ビット整数である場合、バイトとして表示すると01 00が表示されますが、16ビットワードとして表示すると0001が表示されます(自然な読み取り順序、右側のLSB、日常的に10進数を使用しているように)。en.wikipedia.org/wiki/Endianness
ジェイミーハンラハン14年

@JamieHanrahanのコメントを追加するには、「および他のすべてのリトルエンディアンCPU」をお読みください。これがまさにエンディアンのポイントです。
glglgl 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.