在shell脚本中将二进制数据转换为十六进制

时间:2011-06-09 12:16:46

标签: linux scripting hexdump

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

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

8 个答案:

答案 0 :(得分:64)

也许使用xxd

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

答案 1 :(得分:29)

小心!

hexdumpxxd以不同的字节序给出结果!

$ echo -n $'\x12\x34' | xxd -p
1234
$ echo -n $'\x12\x34' | hexdump -e '"%x"'
3412

http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef01543533e604970c-800wi:D

答案 2 :(得分:21)

使用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系统弃用oddump,GNU系统反过来。”

答案 3 :(得分:10)

也许您可以在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脚本中。

答案 4 :(得分:6)

所有解决方案似乎难以记忆或太复杂,我发现使用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 hex,'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

答案 5 :(得分:3)

dd + hexdump也可以使用:

dd bs=1 count=1 if=/dev/urandom 2>/dev/null  | hexdump -e '"%x"'

答案 6 :(得分:3)

如果您需要大型流(无新行),可以使用trxxd(vim的一部分)进行逐字节转换。

head -c1024 /dev/urandom | xxd -p | tr -d $'\n'

或者您可以使用hexdump(posix)进行逐字转换。

head -c1024 /dev/urandom | hexdump '-e"%x"'

请注意,区别在于字节顺序。

答案 7 :(得分:1)

这三个命令将打印相同(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