Bisakah xxd digunakan untuk menampilkan representasi biner dari angka hex, bukan string?


10

Saya ingin menghasilkan paket biner mentah dari hex di baris perintah untuk tujuan pengujian protokol. Saya berharap lebih mudah untuk melakukannya dengan cara ini daripada menulis aplikasi.

Inilah yang saat ini terjadi:

echo '0A' | xxd  -b
0000000: 00110000 01000001 00001010

Yang ingin saya miliki adalah:

echo '0A' | xxd  -b
0000000: 00001010    

atau

echo '0A' | xxd  -b
0000000: 01010000    

Karena saya tidak yakin dengan endianess yang diperlukan. Saya ingin dapat mengubahnya jika perlu. Apakah ini dapat dicapai?

Jawaban:


9

echo '0A'menghasilkan tiga karakter 0 A NL:; xxd -bkemudian akan mencetak tiga karakter dalam biner. Jika Anda hanya menginginkan byte tunggal yang nilainya 10 (yaitu heksadesimal A), Anda dapat menulis (dalam bash):

echo -n $'\x0A'
      ^ ^  ^
      | |  |
      | |  +-- `\x` indicates a hexadecimal escape
      | +----- Inside a $' string, escapes are interpreted
      +------- -n suppresses the trailing newline

Alternatif yang lebih baik adalah printf '\x0A'; printf mengartikan sekuensi yang lolos dalam string format, dan tidak menampilkan baris baru yang tersirat. (Ini adalah solusi yang kompatibel dengan Posix, yang harus bekerja pada semua shell yang kompatibel dengan Posix.) Namun kemungkinan bash lainnya adalah echo -n -e '\x0A'; -ebendera (non-standar) meminta gema untuk menafsirkan urutan pelarian.

echo '1' | xxd -btidak akan menampilkan yang setara dengan hex 50, karena xxdtidak tahu itu 0Aadalah nomor hex dan 1bukan. Juga, kode ascii untuk karakter 1adalah hex 31, bukan 50.

Endianness tidak memengaruhi byte. Urutan bit dalam byte sepenuhnya konseptual sampai byte ditransmisikan melalui garis serial dan itupun hanya terlihat dengan osiloskop atau yang serupa.


Maaf tentang 50. Ini salah ketik. Perbaiki sekarang
TheMeaningfulEngineer

7

Jika Anda menginginkan keluaran biner untuk serangkaian digit hex xxd -r -p,. Misalnya:

 $ echo '0A0B0C0D' | xxd -r -p | xxd -b
 0000000: 00001010 00001011 00001100 00001101                    ....

mengubah 0A0B0C0D menjadi empat byte biner (panggilan pertama ke xxd), dan kemudian mengubahnya kembali untuk dicetak (panggilan kedua). Anda mengatakan Anda menginginkan keluaran biner, tetapi contoh yang Anda coba adalah representasi yang dapat dicetak.

Saya tidak tahu apa-apa di mana endianness adalah ambigu pada tingkat menggigit, seperti yang Anda maksudkan dalam contoh kedua Anda. Konversi dalam xxd adalah byte murni pada suatu waktu, tidak dengan asumsi mereka mewakili angka multi-byte tertentu.


2

Ya, Anda dapat menggunakannya xxduntuk melakukan itu, tetapi Anda mungkin tidak menyukai format input. Dari contoh Anda, 0x0a adalah nilai hex dari baris ASCII. Anda dapat membuat file dengan satu baris baru di dalamnya, lalu gunakan xxduntuk membuat daftar:

$ xxd one_line_file
0000000: 0a                                       .

Anda bisa mendapatkan satu baris baru xxddari output itu jika Anda memberi tanda yang sesuai:

$ echo "0000000: 0a" | xxd -r > another_one_line_file
$ xxd another_one_line_file
0000000: 0a 

xxdmemiliki format output yang cukup bagus, saya pikir itu tidak terlalu sulit untuk membuat paket Anda menggunakan editor teks, kemudian gunakan xxd -runtuk pergi ke biner. .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.