Xxd có thể được sử dụng để xuất đại diện nhị phân của số hex, không phải là một chuỗi không?


10

Tôi muốn tạo một gói nhị phân thô từ hex trong dòng lệnh cho mục đích kiểm tra một giao thức. Tôi hy vọng nó đơn giản để làm theo cách này hơn là viết một ứng dụng.

Đây là những gì hiện đang xảy ra:

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

Những gì tôi muốn có là:

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

hoặc là

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

Vì tôi không chắc chắn về endianess cần thiết. Tôi muốn có thể thay đổi nó khi cần thiết. Điều này có thể đạt được?

Câu trả lời:


9

echo '0A'tạo ra ba ký tự : 0 A NL; xxd -bsau đó sẽ in ba ký tự đó thành nhị phân. Nếu bạn chỉ muốn một byte duy nhất có giá trị là 10 (tức là thập lục phân A), bạn có thể viết (bằng bash):

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

Một sự thay thế tốt hơn sẽ là printf '\x0A'; printf diễn giải các chuỗi thoát trong chuỗi định dạng và không xuất ra các dòng mới. (Đây là giải pháp tương thích Posix, sẽ hoạt động trên mọi vỏ tương thích Posix.) Tuy nhiên, một khả năng bash khác là echo -n -e '\x0A'; -ecờ (không chuẩn) yêu cầu echo để giải thích các chuỗi thoát.

echo '1' | xxd -bsẽ không xuất ra số tương đương với hex 50, vì xxdkhông biết đó 0Alà số hex và 1không. Ngoài ra, mã ascii cho ký tự 1là hex 31, không 50.

Endianness không ảnh hưởng đến byte. Thứ tự của các bit bên trong một byte là hoàn toàn theo khái niệm cho đến khi byte được truyền qua một chuỗi nối tiếp và thậm chí sau đó nó chỉ hiển thị với một máy hiện sóng hoặc một cái gì đó tương tự.


Xin lỗi về 50. Đó là một lỗi đánh máy. Sửa lỗi ngay bây giờ
TheMeaningfulEngineer

7

Nếu bạn muốn đầu ra nhị phân cho một chuỗi các chữ số hex , xxd -r -p. Ví dụ:

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

chuyển đổi 0A0B0C0D thành bốn byte nhị phân (cuộc gọi đầu tiên thành xxd), sau đó chuyển đổi lại thành có thể in được (cuộc gọi thứ hai). Bạn nói rằng bạn muốn có một đầu ra nhị phân, nhưng các ví dụ bạn đang cố gắng là một đại diện có thể in được.

Tôi không biết bất cứ điều gì mà sự tồn tại mơ hồ ở cấp độ nhanh nhẹn, như bạn ngụ ý trong ví dụ thứ hai của bạn. Chuyển đổi trong xxd là một byte thuần tại một thời điểm, không giả sử rằng chúng đại diện cho bất kỳ số nhiều byte cụ thể nào.


2

Có, bạn có thể sử dụng xxdđể làm điều đó, nhưng bạn có thể không thích định dạng đầu vào. Từ ví dụ của bạn, 0x0a là giá trị hex của dòng mới ASCII. Bạn có thể tạo một tệp có một dòng mới trong đó, sau đó sử dụng xxdđể tạo danh sách:

$ xxd one_line_file
0000000: 0a                                       .

Bạn có thể nhận được một dòng mới xxdtừ đầu ra đó nếu bạn cung cấp cho nó các cờ thích hợp:

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

xxdcó một định dạng đầu ra khá đẹp, tôi không nghĩ sẽ quá tệ khi tạo các gói của bạn bằng trình soạn thảo văn bản, sau đó sử dụng xxd -rđể đi đến nhị phân. .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.