我想将二进制数据转换为十六进制,仅此而已,没有花哨的格式等等。
hexdump
似乎太聪明了,对我来说它“过度格式化”。我想从 /dev/random 中获取 x 字节并将它们作为十六进制传递。
我最好只使用标准的 Linux 工具,这样我就不需要在每台机器上安装它(有很多)。
也许使用
xxd
:
% xxd -l 16 -p /dev/random
193f6c54814f0576bc27d51ab39081dc
小心!
hexdump
和 xxd
以不同的字节顺序给出结果!
$ echo -n $'\x12\x34' | xxd -p
1234
$ echo -n $'\x12\x34' | hexdump -e '"%02x"'
3412
$ echo -n $'\x01\x02' | hexdump -e '/1 "%02x"'
0102
简单解释一下。大端与小端 :D
使用 od(GNU 系统):
$ echo abc | od -A n -v -t x1 | tr -d ' \n'
6162630a
$ echo abc | hexdump -ve '/1 "%02x"'
6162630a
“根据您的系统类型,这两个实用程序中的一个或全部都可用 - BSD 系统不推荐使用 od 进行 hexdump,GNU 系统则相反。”
也许你可以用 C 语言编写自己的小工具,并即时编译它:
int main (void) {
unsigned char data[1024];
size_t numread, i;
while ((numread = read(0, data, 1024)) > 0) {
for (i = 0; i < numread; i++) {
printf("%02x ", data[i]);
}
}
return 0;
}
然后从标准输入输入:
cat /bin/ls | ./a.out
您甚至可以使用heredoc语法将这个小C程序嵌入到shell脚本中。
所有的解决方案似乎都很难记住或太复杂。我发现使用
printf
是最短的:
$ printf '%x\n' 256
100
但正如评论中指出的,这不是作者想要的,所以公平地说,下面是完整的答案。
...使用上面的方法输出实际的二进制数据流:
printf '%x\n' $(cat /dev/urandom | head -c 5 | od -An -vtu1)
它的作用:
printf '%x,' 1 2 3
,将打印 1,2,3,
cat /dev/urandom
- 它输出随机二进制数据head -c 5
- 将二进制数据限制为 5 个字节od -An -vtu1
- 八进制转储命令,将二进制转换为十进制作为测试用例('a' 是 61 十六进制,'p' 是 70 十六进制,...):
$ printf '%x\n' $(echo "apple" | head -c 5 | od -An -vtu1)
61
70
70
6c
65
或者要测试单个二进制字节,在输入时我们给出 61 个十进制(“=”字符)来生成二进制数据(
'\\x%x'
格式可以做到这一点)。上述命令将正确输出3d(十进制61):
$printf '%x\n' $(echo -ne "$(printf '\\x%x' 61)" | head -c 5 | od -An -vtu1)
3d
如果您需要大流(没有换行符),您可以使用
tr
和 xxd
(Vim 的一部分)进行逐字节转换。
head -c1024 /dev/urandom | xxd -p | tr -d $'\n'
或者您可以使用
hexdump
(POSIX) 进行逐字转换。
head -c1024 /dev/urandom | hexdump '-e"%x"'
请注意,区别在于字节顺序。
有时,如果您的目标平台不止一个,perl5 的可移植性会更好。每个 Linux 发行版和 Unix 操作系统都附带它。您通常可以在容器映像中找到它,而 xxd 或 hexdump 等其他工具不可用。下面是如何在 Perl 中做同样的事情:
$ head -c8 /dev/urandom | perl -0777 -ne 'print unpack "H*"'
5c9ed169dabf33ab
$ echo -n $'\x01\x23\xff' | perl -0777 -ne 'print unpack "H*"'
0123ff
$ echo abc | perl -0777 -ne 'print unpack "H*"'
6162630a
请注意,这会更多地使用 slurp,这会导致 Perl 将整个输入读取到内存中,当输入较大时,这可能不是最佳的。
这三个命令将打印相同的内容(0102030405060708090a0b0c):
n=12
echo "$a" | xxd -l "$n" -p
echo "$a" | od -N "$n" -An -tx1 | tr -d " \n" ; echo
echo "$a" | hexdump -n "$n" -e '/1 "%02x"'; echo
假设
n=12
和 $a
是从 1 到 26 的字节值:
a="$(printf '%b' "$(printf '\\0%o' {1..26})")"
这可以用来获取每个程序中的
$n
随机字节值:
xxd -l "$n" -p /dev/urandom
od -vN "$n" -An -tx1 /dev/urandom | tr -d " \n" ; echo
hexdump -vn "$n" -e '/1 "%02x"' /dev/urandom ; echo