onaltılı bir dizgiyi ikilik dosyaya dönüştür ve netcat ile gönder


46

Gönderebileceğim bir ikili dosyam var netcat:

$ nc -l localhost 8181 < my.dat

Dosya bunu içeriyor:

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

Gerçekten yapmak istediğim, altıgen dizgiyi doğrudan göndermek. Bunu denedim:

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

Bununla birlikte, yukarıdaki komut sadece ascii dizesini doğrudan adresine gönderir nc.

Yanıtlar:


55

Kullandığım -r ve -p anahtarı XXd :

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

@Gilles cevabından ilham alan, işte bir perl versiyonu:

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

Önde gelen \ x çizgili olduğunda Postgres'in bytea hex formatı için harika çalışır.
nathancahill

Teşekkürler! Firefox sözlüklerinin tezahür ettiği özetleri kontrol etmek için de harika çalışıyor! md5sum ../it/manifest.json | awk '{print $1}' | xxd -r -p | hd
Avio

26

İşte xxdveya olmadan bir çözüm perl:

Eğer echokabuğunuzun yapısı onu destekliyorsa ( bashve zshyapar ama yapmazsanız dash), sadece sağa ters eğik çizgi kaçarlarını kullanmanız gerekir:

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

Eğer varsa /bin/echodan GNU coreutils (Linux sistemlerinde neredeyse standart) veya BusyBox dan sen de kullanabilirsiniz.

Birlikte sedbir kaçış deseni oluşturabilirsiniz:

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

kombine:

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

çok güzel bir çözüm!
Chris Snow,

2
Echo echoile değiştirmek , printfyankı genişletilmiş özellikleri destekliyorsa veya olmasa da tahmin çalışmasını kaldırır. printf "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181.
Jaakko,

11

Eğer varsa xxd, bu kolay: onaltılık ve onaltılık dönüştürebilirsiniz.

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

Onaltılıyı sadece POSIX araçlarını kullanarak ikili dosyaya dönüştürmenin makul (ve oldukça hızlı) bir yolu olduğunu sanmıyorum. Perl'de oldukça kolay yapılabilir. Aşağıdaki komut dosyası onaltılık sayıyı ikiliye dönüştürür, onaltılık basamak olmayan herhangi bir giriş karakterini yok sayar. Bir giriş satırında tek sayıda onaltılık basamak olup olmadığını şikayet eder.

#!/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"; }

Gerçekten POSIX'e (örneğin gömülü bir cihaza) bağlı kalmanız gerekiyorsa , onaltılık yerine Base64 kullanmanızı öneririm . Base64 kodunu çözmek için uudecode kullanabilirsiniz . Girdi, uuencode tarafından üretilen başlık biçimine ve bitiş satırına sahip olmalıdır, ham Base64 olamaz.

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

1

Buna benzer: https://stackoverflow.com/questions/1604765/linux-shell-scripting-hex-string-to-bytes/47253233#47253233

Stdin'den çeşitli dönüşümler yapan ve sonucu stdout'a dağıtan bir araç yazdım. cryptocli ddsadece bu dönüşümleri yapacak ve başka bir şey yapmayacak.

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

Senin için çalışacak.

Araç açık kaynaktır, burada bulabilirsiniz: https://github.com/tehmoon/cryptocli

Düzenle:

Ayrıca aracımı kullanarak doğrudan hex'e kodlayabilirsiniz:

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

(1) 616263Bu soru ile ne ilgisi var? Lütfen sorudaki verileri kullanın. (2) Bunun nasıl çalıştığını açıklayabilir misiniz? Lütfen yorumlarınızı yanıtlamayın, cevabınızı daha net ve eksiksiz hale getirmek için düzenleyin .
G-Man
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.