感觉有点愚蠢的问这个(听起来很基础),但在其他地方找不到答案。 我想将二进制数据转换为hex,只是,没有花哨的格式和所有。 hexdump
看起来太聪明了,对我来说“过分的格式化”。 我想从/ dev / random中获取x个字节,并以hex的forms传递它们。
最好我只使用标准的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/.a/6a00d8341d3df553ef01543533e604970c-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.org/wiki/Hex_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
您甚至可以使用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 hex,…):
$ printf '%x\n' $(echo "apple" | head -c 5 | od -An -vtu1) 61 70 70 6c 65
或测试单个二进制字节,在输入上给出61十进制('='char)来产生二进制数据( '\\x%x'
格式),上面的命令将正确输出3d(十进制61):
$printf '%x\n' $(echo -ne "$(printf '\\x%x' 61)" | head -c 5 | od -An -vtu1) 3d
dd + hexdump也将工作:
dd bs=1 count=1 if=/dev/urandom 2>/dev/null | hexdump -e '"%x"'
如果你需要一个大的流(没有换行符),你可以使用tr
和xxd
(vim的一部分)进行逐字节的转换。
head -c1024 /dev/urandom | xxd -p | tr -d $'\n'
或者你可以使用hexdump
(posix)进行逐字转换。
head -c1024 /dev/urandom | 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