我想把二进制数据转换成十六进制,就是这样,没有花哨的格式化之类的。hexdump
这似乎太聪明了,而且它对我来说是 "过度格式化"。我想从devrandom中提取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 '"%x"'
3412
http:/geekandpoke.typepad.com.a6a00d8341d3df553ef01543533e604970c-800wi。 :D
使用od(GNU系统)。
$ echo abc | od -A n -v -t x1 | tr -d ' \n'
6162630a
用hexdump (BSD系统):
$ echo abc | hexdump -ve '/1 "%02x"'
6162630a
从 http:/en.wikipedia.orgwikiHex_dump#od_and_hexdump。: "根据你的系统类型,这两个工具中的一个或两个都是可用的--BSD系统不支持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
你甚至可以把这个小的C程序嵌入到shell脚本中 使用heredoc语法.
所有的解决方法似乎都很难记或者太复杂,我觉得用 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个十进制('='char)产生二进制数据('='char)。'\\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"'
注意,区别在于endianness。
dd+hexdump也可以。
dd bs=1 count=1 if=/dev/urandom 2>/dev/null | hexdump -e '"%x"'
这三个命令的打印结果是一样的 (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