将二进制数据转换为hex的shell脚本?

感觉有点愚蠢的问这个(听起来很基础),但在其他地方找不到答案。 我想将二进制数据转换为hex,只是,没有花哨的格式和所有。 hexdump看起来太聪明了,对我来说“过分的格式化”。 我想从/ dev / random中获取x个字节,并以hex的forms传递它们。

最好我只使用标准的Linux工具,所以我不需要在每台机器上安装它(有很多)

也许使用xxd

 % xxd -l 16 -p /dev/random 193f6c54814f0576bc27d51ab39081dc 

小心!

hexdumpxxd给出了不同的排序结果!

 $ 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 \ n'…. – 打印一个整数序列,即。 printf '%x,' 1 2 3 ,将打印1,2,3,
  • $(…) – 这是获取某些shell命令的输出并处理它的一种方法
  • 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"' 

如果你需要一个大的流(没有换行符),你可以使用trxxd (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