Если у вас есть xxd
, это легко: он может конвертировать в и из шестнадцатеричного.
echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181
Я не думаю, что есть разумный (и достаточно быстрый) способ преобразования шестнадцатеричного числа в двоичное с использованием только инструментов POSIX. Это может быть сделано довольно легко в Perl. Следующий скрипт преобразует шестнадцатеричное в двоичное, игнорируя любой входной символ, который не является шестнадцатеричной цифрой. Он жалуется, если строка ввода содержит нечетное число шестнадцатеричных цифр.
#!/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"; }
Если вам действительно нужно придерживаться POSIX (например, на встроенном устройстве), я рекомендую использовать Base64 вместо шестнадцатеричного. Вы можете использовать uudecode для декодирования Base64. Входные данные должны иметь формат заголовка и конечную строку, создаваемую uuencode , это не может быть необработанный Base64.
uudecode <<EOF | nc -l localhost 8181
begin-base64 644 -
AAYwMDAwTkM=
====
EOF