Answers:
我将-r和-p开关用于xxd:
$ echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181
感谢@Gilles答案的启发,这是一个perl版本:
$ echo '0006303030304e43' | perl -e 'print pack "H*", <STDIN>' | nc -l localhost 8181
md5sum ../it/manifest.json | awk '{print $1}' | xxd -r -p | hd
这里没有xxd
或的解决方案perl
:
如果echo
您的shell内置支持(bash
并且支持zsh
,但不支持dash
),则只需要使用正确的反斜杠转义即可:
echo -ne '\x00\x06\x30\x30\x30\x30\x4e\x43' | nc -l localhost 8181
如果你有/bin/echo
从GNU的coreutils(在Linux系统上几乎标准)或busybox的,你可以使用它了。
有了sed
你可以生成一个逃脱模式:
$ echo '0006303030304e43' | sed -e 's/../\\x&/g'
\x00\x06\x30\x30\x30\x30\x4e\x43
合并:
echo -ne "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181
echo
为printf
可以消除猜测工作。printf "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181
。
如果您有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
与此类似:https : //stackoverflow.com/questions/1604765/linux-shell-scripting-hex-string-to-bytes/47253233#47253233
我编写了一个工具,可以执行从stdin到stdout的各种转换。cryptocli dd
只会进行这些转换,而不会做其他任何事情。
echo -n 0006303030304e43 | cryptocli dd -decoders hex | nc -l localhost 8081
将为您工作。
该工具是开源的,您可以在这里找到它:https : //github.com/tehmoon/cryptocli
您也可以使用我的工具直接编码为十六进制:
cat my.dat | cryptocli dd -encoders hex | nc -l localhost 8081
616263
与这个问题有什么关系?请使用问题中的数据。(2)您能解释一下它是如何工作的吗?请不要在评论中回复,请修改您的答案以使其更清晰,更完整。