chuyển đổi một chuỗi hex thành nhị phân và gửi với netcat


46

Tôi có một tệp nhị phân mà tôi có thể gửi cùng netcat:

$ nc -l localhost 8181 < my.dat

Các tập tin có chứa này:

$ xxd my.dat
0000000: 0006 3030 3030 4e43                      ..0000NC

Những gì tôi thực sự muốn làm là gửi chuỗi hex trực tiếp. Tôi đã thử điều này:

$ echo '0006303030304e43' | nc -l localhost 8181

Tuy nhiên, lệnh trên chỉ gửi chuỗi ascii trực tiếp đến nc.

Câu trả lời:


55

Tôi đã sử dụng chuyển đổi -r-p sang xxd :

$ echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181

Nhờ vào cảm hứng từ câu trả lời @Gilles, đây là phiên bản perl:

$ echo '0006303030304e43' | perl -e 'print pack "H*", <STDIN>' | nc -l localhost 8181

Hoạt động tuyệt vời cho định dạng hex bytea của Postgres khi \ x hàng đầu bị xóa.
nathancahill

Cảm ơn! Hoạt động tuyệt vời cũng để kiểm tra các bản tóm tắt từ điển Firefox! md5sum ../it/manifest.json | awk '{print $1}' | xxd -r -p | hd
Avio

26

Đây là một giải pháp không có xxdhoặc perl:

Nếu phần echotích hợp của shell của bạn hỗ trợ nó ( bashzshkhông, nhưng không dash), bạn chỉ cần sử dụng dấu gạch chéo ngược đúng:

echo -ne '\x00\x06\x30\x30\x30\x30\x4e\x43' | nc -l localhost 8181

Nếu bạn có /bin/echotừ GNU coreutils (gần như tiêu chuẩn trên các hệ thống Linux) hoặc từ busybox, bạn cũng có thể sử dụng nó.

Với sedbạn có thể tạo một mẫu thoát:

$ echo '0006303030304e43' | sed -e 's/../\\x&/g'
\x00\x06\x30\x30\x30\x30\x4e\x43

Kết hợp:

echo -ne "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181

giải pháp rất hay!
Chris Snow

2
Thay thế echobằng printfloại bỏ công việc đoán nếu echo có hỗ trợ các tính năng mở rộng hay không. printf "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181.
Jaakko

12

Nếu bạn có xxd, điều đó thật dễ dàng: nó có thể chuyển đổi sang và từ thập lục phân.

echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181

Tôi không nghĩ có một cách hợp lý (và hợp lý nhanh chóng) để chuyển đổi hệ thập lục phân thành nhị phân chỉ bằng các công cụ POSIX. Nó có thể được thực hiện khá dễ dàng trong Perl. Kịch bản sau đây chuyển đổi thập lục phân thành nhị phân, bỏ qua mọi ký tự đầu vào không phải là chữ số thập lục phân. Nó phàn nàn nếu một dòng đầu vào chứa một số lẻ các chữ số thập lục phân.

#!/usr/bin/env perl
$^W = 1;
$c = undef;
while (<>) {
    tr/0-9A-Fa-f//cd;
    if (defined $c) { warn "Consuming $c"; $_ = $c . $_; $c = undef; }
    if (length($_) & 1) { s/(.)$//; $c = $1; }
    print pack "H*", $_;
}
if (!eof) { die "$!"; }
if (defined $c) { warn "Odd number of hexadecimal digits"; }

Nếu bạn thực sự cần phải sử dụng POSIX (ví dụ: trên thiết bị nhúng), tôi khuyên bạn nên sử dụng Base64 thay vì thập lục phân. Bạn có thể sử dụng uudecode để giải mã Base64. Đầu vào phải có định dạng tiêu đề và dòng kết thúc được tạo bởi uuencode , nó không thể là Base64 thô.

uudecode <<EOF | nc -l localhost 8181
begin-base64 644 -
AAYwMDAwTkM=
====
EOF

1

Tương tự như thế này: https://stackoverflow.com/questions/1604765/linux-shell-scripting-hex-opes-to-bytes/47253233#47253233

Tôi đã viết một công cụ thực hiện các phép biến đổi khác nhau từ stdin và đưa ra kết quả đến thiết bị xuất chuẩn. cryptocli ddsẽ chỉ làm những biến đổi đó và không có gì khác.

echo -n 0006303030304e43 | cryptocli dd -decoders hex | nc -l localhost 8081

Sẽ làm việc cho bạn.

Công cụ này là mã nguồn mở, bạn có thể tìm thấy nó ở đây: https://github.com/tehmoon/cryptocli

Biên tập:

Bạn cũng có thể mã hóa trực tiếp thành hex bằng công cụ của tôi:

cat my.dat | cryptocli dd -encoders hex | nc -l localhost 8081

(1) Điều gì 616263phải làm với câu hỏi này? Vui lòng sử dụng dữ liệu từ câu hỏi. (2) Bạn có thể giải thích làm thế nào điều này hoạt động? Xin vui lòng không trả lời trong các bình luận, chỉnh sửa câu trả lời của bạn để làm cho nó rõ ràng và đầy đủ hơn.
G-Man nói 'Phục hồi Monica'
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.