lsとhexdumpが私のファイルサイズに同意しないのはなぜですか?

lsとhexdumpが私のファイルサイズに同意しないのはなぜですか?

テスト目的で(SSHクライアントからUTF-8出力をテストするために)ファイルを(vimで)作成しました。しかし、このファイルに奇妙なことが起こります。

ファイルにどのバイトがあるかを知りたかったので、次のようにしましたhexdump

username@computername:~$ hexdump -x intl.txt
0000000    9ecf    000a
0000003

まあ、そこには4バイトがあります。どのように00と0aがそこに入ってきたのか分からないが、とにかく言葉です。しかし、奇妙なことは次のとおりです。

username@computername:~$ ls -al intl.txt
-rw-rw-r-- 1 username username 3 Mar 26 15:14 intl.txt

待って、3バイトですか?ここで何が起こっているのでしょうか?

これは十分に奇妙ではないように、hexdump -C非常に異なる結果を提供します。

username@computername:~$ hexdump -C intl.txt
00000000  cf 9e 0a                                          |...|
00000003

Vimもこのファイルについて少し混乱しています。起動すると、ステータス行に次のように表示されます。

"intl.txt" 1L, 3C

ただし、一番上には次の内容が表示されます(使用set list)。

Ϟ$
~
~
~
~

したがって、3つの文字があると思いますが、1つだけを印刷します。 koppaとその下に空白行が印刷されているとわかります...

ベストアンサー1

他の人が指摘したように、これはファイルがhexdump -x2バイトの単語を含むと見なされるためです。存在するリトルエンディアンシステム(ほとんどのデスクトップがそうです)。これは、表示される前にバイトが交換されることを意味します。これは、バイト値がペアで印刷され、これらのバイトの順序が変わることを意味します。バイト数が奇数なので、hexdumpゼロを追加して最終ペアを作成します。次に0を0a。これは文書化された動作hexdumpなので、嘘をつくのではありません!

より良いコマンドは、hexdump -Cファイルに表示される順序でバイトを表示する形式化された出力を取得することです。また、これは0aファイルを作成した人が自動的に追加した可能性がある新しい行です(vimデフォルトではこれを行います)。たとえば、echoこれを行わないように指示しないと、常に新しい行が追加されます。存在するbash

echo -e '\xcf\x9e' | hexdump -C

同じ結果が得られますが、改行を抑えることで-n期待した結果が得られます。

echo -ne '\xcf\x9e' | hexdump -C

改行の追加を停止するには、次の手順を実行しますvim

:set noeol
:set binary

おすすめ記事