Konversi string hex menjadi ascii di baris perintah bash

Saya memiliki banyak string semacam ini dan saya ingin menemukan perintah untuk mengubahnya dalam ascii, saya mencoba dengan echo -e dan od, tetapi tidak berhasil.

0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2

Ini berhasil bagi saya.

$ echo 54657374696e672031203220330 | xxd -r -p
Testing 1 2 3$

-r memerintahkannya untuk mengkonversi hex ke ascii sebagai lawan dari mode normalnya yang melakukan sebaliknya

-p memerintahkannya untuk menggunakan format biasa.

Komentar (1)
Larutan

Kode ini akan mengkonversi teks 0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2 ke dalam aliran 11 byte dengan nilai yang setara. Byte ini akan ditulis ke standard out.

TESTDATA=$(echo '0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2' | tr '.' ' ')
for c in $TESTDATA; do
    echo $c | xxd -r
done

Seperti yang telah ditunjukkan oleh orang lain, ini tidak akan menghasilkan string ASCII yang dapat dicetak karena alasan sederhana bahwa byte yang ditentukan bukan ASCII. Anda perlu memposting informasi lebih lanjut tentang bagaimana Anda memperoleh string ini agar kami dapat membantu Anda.

Cara kerjanya: xxd -r menerjemahkan data heksadesimal ke biner (seperti reverse hexdump). xxd mengharuskan setiap baris dimulai dengan nomor indeks dari karakter pertama pada baris tersebut (jalankan hexdump pada sesuatu dan lihat bagaimana setiap baris dimulai dengan nomor indeks). Dalam kasus kita, kita ingin nomor tersebut selalu nol, karena setiap eksekusi hanya memiliki satu baris. Seperti keberuntungan, data kita sudah memiliki angka nol sebelum setiap karakter sebagai bagian dari notasi 0x. Huruf kecil x diabaikan oleh xxd, jadi yang harus kita lakukan adalah memipa setiap karakter 0xhh ke xxd dan biarkan xxd melakukan pekerjaannya.

Tr menerjemahkan titik menjadi spasi sehingga for akan membaginya dengan benar.

Komentar (5)

echo -e pasti gagal untuk Anda karena escaping yang salah. Kode berikut bekerja dengan baik untuk saya pada output yang sama dari your_program with arguments:

echo -e $(your_program with arguments | sed -e 's/0x\(..\)\.\?/\\x\1/g')

Namun harap dicatat bahwa hexstring asli Anda terdiri dari karakter yang tidak dapat dicetak.

Komentar (0)