web-dev-qa-db-ja.com

Unix:ppmファイルでのxxdコマンドの使用

私はunixをかなり使い始めており、一部のコマンドの機能を理解するのに苦労しています。たとえば、ppmファイルでxxdを使用すると(つまり、xxd image.ppm)次のような出力が得られます。

00000000: 5036 0a31 3131 2031 3332 0a32 3535 0a55  P6.111 132.255.U
00000010: 6137 5966 3958 6939 566a 3953 6739 5464  a7Yf9Xi9Vj9Sg9Td
00000020: 3b57 643a 5763 3654 6335 5161 334e 5c30  ;Wd:Wc6Tc5Qa3N\0
00000030: 4f5a 3250 5d35 5361 3556 6334 5561 3352  OZ2P]5Sa5Vc4Ua3R
00000040: 5e32 515d 3256 6035 5b64 3856 6136 4a55  ^2Q]2V`5[d8Va6JU
...
...

誰かがこの出力が何を表しているのか私に説明してもらえますか?

2
Shoaib Ahmed

3つの部分は、入力の開始からのオフセット(16進数)です。 16進数のデータ。印刷可能な場合、文字でのデータ。これは1行あたり16バイトです。これは、Niceラウンド数であり、画面にうまく収まるためです。

このような表示は、バイナリデータとテキストデータの両方が重要な場合に非常によく使用されます。例えば。 _tcpdump -X_も同様のものを使用します。

最初の行で:

_00000000: 5036 0a31 3131 2031 3332 0a32 3535 0a55  P6.111 132.255.U
_

これは始まりなので、オフセット_00000000_はゼロです。 _50_、_36_、および_0a_は、P、_6_、および改行などの文字コードです。印刷できない文字は、右側の列にドットとして印刷されます。


一部のバリアントでは、中央のセクションのバイトが各グループ内で「反転」される場合があることに注意してください。これは、プログラムが入力をリトルエンディアンの数値として解釈し、連結された個々のバイトではなく、そのように表示する場合に発生します。

_xxd -e_はまさにこれを行います。検討してください:

_$ printf  "ABCD" | xxd -e -g2 
00000000: 4241 4443                                ABCD
_

Aの_41_とBの_42_は、他の2つと同様に、逆の順序で表示されます。 od from GNU coreutilsもグループ内のバイトを反転します。疑わしい場合は、再確認するか、1つずつグループ化することを目指してください。(例:_od -x_と_od -tx1_はこの中で。)


もちろん、データ自体の意味は、ppm形式のドキュメントから見つけることができます。私のシステムには、manページppm(5)があります。 (オンライン die.netのバージョン はフォーマットが壊れています。)

その最初の行から、サンプルあたり8ビットのサイズ111x132ピクセルのRGB画像であることがわかります。

6
ilkkachu

これは、かなり一般的なhexdump形式の16進ダンプであり、出力の各行にはバイトオフセット(16進数*)、16バイトの16進数字、およびこれらの同じバイトのASCII表現)が含まれています。 。

*各行のバイトオフセットが0x10 hex(16進数で16)ずつ増加することに注意してください。

man xxdから:

[〜#〜]名前[〜#〜]

   xxd - make a hexdump or do the reverse.

[〜#〜] synopsis [〜#〜]

   xxd -h[elp]
   xxd [options] [infile [outfile]]
   xxd -r[evert] [options] [infile [outfile]]

[〜#〜]説明[〜#〜]

xxdは、指定されたファイルまたは標準入力の16進ダンプを作成します。また、16進ダンプを元のバイナリ形式に戻すこともできます。 uuencode(1)やuudecode(1)と同様に、バイナリデータを「メールセーフ」ASCII表現)で送信できますが、利点があります。標準出力へのデコードのほか、バイナリファイルのパッチの実行にも使用できます[...]

16進ダンプは、ファイルの正確な場所にあるバイトを正確に知る必要がある場合に非常に役立ちます。たとえば、ファイルに予期しないバイト(NUL(0x00)または復帰(0x0D)など)が含まれている場合や、@ ilkkachuが彼の回答で述べているように、問題の診断に役立ちます。バイナリファイル形式が文書化されている(または、とにかくそれを知っている)場合、特定のオフセット(場所)のバイトの特定の意味を解釈することがしばしば可能です。

4
cas