convert a hex string to binary and send with netcat
I used the -r and -p switch to xxd:
$ echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181
Thanks to inspiration from @Gilles answer, here's a perl version:
$ echo '0006303030304e43' | perl -e 'print pack "H*", <STDIN>' | nc -l localhost 8181
Here a solution without xxd
or perl
:
If the echo
builtin of your shell supports it (bash
and zsh
do, but not dash
), you just need to use the right backslash escapes:
echo -ne '\x00\x06\x30\x30\x30\x30\x4e\x43' | nc -l localhost 8181
If you have /bin/echo
from GNU coreutils (nearly standard on Linux systems) or from busybox you can use it, too.
With sed
you can generate a escaped pattern:
$ echo '0006303030304e43' | sed -e 's/../\\x&/g'
\x00\x06\x30\x30\x30\x30\x4e\x43
Combined:
echo -ne "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181
If you have xxd
, that's easy: it can convert to and from hexadecimal.
echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181
I don't think there's a reasonable (and reasonably fast) way to convert hexadecimal to binary using only POSIX tools. It can be done fairly easy in Perl. The following script converts hexadecimal to binary, ignoring any input character that isn't a hexadecimal digit. It complains if an input line contains an odd number of hexadecimal digits.
#!/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"; }
If you really need to stick to POSIX (e.g. on an embedded device), I recommend using Base64 instead of hexadecimal. You can use uudecode to decode Base64. The input must have the header format and end line produced by uuencode, it can't be raw Base64.
uudecode <<EOF | nc -l localhost 8181
begin-base64 644 -
AAYwMDAwTkM=
====
EOF