GNU/Linux >> Belajar Linux >  >> Linux

Mengapa Ls Dan Hexdump Tidak Setuju Tentang Ukuran File?

Saya memiliki file yang saya buat (dalam vim), untuk tujuan pengujian (menguji keluaran UTF-8 di klien SSH). Namun, hal-hal aneh terjadi pada file ini.

Saya bertanya-tanya berapa byte yang ada di file, jadi saya menggunakan hexdump :

[email protected]:~$ hexdump -x intl.txt
0000000    9ecf    000a
0000003

Ok, ada empat byte di sana, Bagaimana 00 dan 0a masuk ke sana, saya tidak jelas, tapi terserah. Namun, di sinilah letak keanehannya:

[email protected]:~$ ls -al intl.txt
-rw-rw-r-- 1 username username 3 Mar 26 15:14 intl.txt

Tunggu, ini tiga byte? Apa yang terjadi di sini?

Seolah itu tidak cukup aneh, hexdump -C memberikan keluaran yang sangat berbeda:

[email protected]:~$ hexdump -C intl.txt
00000000  cf 9e 0a                                          |...|
00000003

Vim juga agak bingung dengan filenya. Ketika saya memulainya, ini memberikan ini di baris status:

"intl.txt" 1L, 3C

Namun, di bagian atas, saya mendapatkan ini (menggunakan set list ):

Ϟ$
~
~
~
~

Jadi, dianggap ada 3 karakter, tetapi hanya mencetak satu. Saya bisa mengerti jika itu mencetak koppa dan garis kosong di bawahnya…

Jawaban yang Diterima:

Seperti yang telah ditunjukkan orang lain, ini karena hexdump -x memperlakukan file sebagai berisi kata-kata 2-byte. Pada sistem little endian (hampir semua desktop), ini berarti byte akan ditukar sebelum ditampilkan. Ini berarti bahwa nilai byte dicetak berpasangan dan urutan byte ini ditukar. Karena Anda memiliki jumlah byte ganjil, hexdump hanya menambahkan nol untuk membuat pasangan terakhir. Angka nol kemudian ditukar dengan 0a . Ini adalah perilaku yang didokumentasikan untuk hexdump , jadi itu tidak membohongi Anda!

Menggunakan hexdump -C adalah perintah yang lebih baik untuk mendapatkan output berformat yang menunjukkan byte sesuai urutannya dalam file. Juga 0a adalah baris baru dan mungkin ditambahkan secara diam-diam oleh apa pun yang membuat file tersebut (vim melakukan ini secara default). Misalnya, echo akan selalu menambahkan baris baru jika Anda tidak melarangnya. Di bash :

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

akan memberikan hasil yang sama, tetapi menekan baris baru dengan -n akan memberikan apa yang Anda harapkan:

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

Untuk menghentikan vim dari menambahkan baris baru:

:set noeol
:set binary

Linux
  1. Mengapa Skrip Bash Tidak Mengenal Alias?

  2. Mengapa Ls -l Tidak Menunjukkan Waktu Dan Atau Tahun Untuk Setiap File??

  3. Mengapa File Descriptor Dibuka Dan Hanya Dibaca Sekali?

  1. Temukan ukuran dan ruang kosong dari sistem file yang berisi file tertentu

  2. Mengapa ukuran direktori selalu 4096 byte di unix?

  3. Bagaimana cara mendapatkan ukuran fisik file di Linux?

  1. Mengapa Cara Berikut Tidak Mengubah Ukuran Batas File Inti?

  2. Perbedaan Antara .exrc Dan .vimrc?

  3. Pengalihan Io Dan Perintah Kepala?