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

dav*_*vka 49 linux scripting hexdump

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

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

unu*_*tbu 66

也许用xxd:

% xxd -l 16 -p /dev/random
193f6c54814f0576bc27d51ab39081dc
Run Code Online (Sandbox Code Playgroud)

  • xxd是vim的一部分,因此可能并不总是安装它. (5认同)
  • 请注意,您可以使用 `-c` 来更改每行的字节数。不幸的是,您只能将其设置为 256,之后您需要有一些换行符。 (3认同)

Zib*_*bri 30

小心!

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

$ echo -n $'\x12\x34' | xxd -p
1234
$ echo -n $'\x12\x34' | hexdump -e '"%x"'
3412
Run Code Online (Sandbox Code Playgroud)

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

  • 使用`echo -n $'\ x12\x34'| hexdump -e'/ 1"%x"'`得到相同的字节序. (4认同)
  • 还要注意!`hexdump` 将去除前导零。 (3认同)

Håk*_*and 22

使用od(GNU系统):

$ echo abc | od -A n -v -t x1 | tr -d ' \n'
6162630a
Run Code Online (Sandbox Code Playgroud)

使用hexdump(BSD系统):

$ echo abc | hexdump -ve '/1 "%02x"'
6162630a
Run Code Online (Sandbox Code Playgroud)

来自http://en.wikipedia.org/wiki/Hex_dump#od_and_hexdump:
"根据您的系统类型,这两个实用程序中的任何一个或两个都可用 - BSD系统弃用oddump,GNU系统反过来."

  • 四年后(我知道不多),大多数时候我读了关于 *nix 的帖子,我学到了一些非常古老的东西,但对我来说仍然是全新的。+1 为 od,从来没有听说过它,非常有用,甚至在 Cygwin 上也存在。;-) (2认同)

Bla*_*iev 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;
}
Run Code Online (Sandbox Code Playgroud)

然后从标准输入中提取它:

cat /bin/ls | ./a.out
Run Code Online (Sandbox Code Playgroud)

您甚至可以使用heredoc语法将这个小型C程序嵌入到shell脚本中.

  • C,为此?这太过分了. (4认同)
  • 好吧,但是您可以完全控制格式和行为:-) (2认同)
  • 难以置信,但这很可能是这个问题的最佳答案。 (2认同)

mar*_*inj 7

所有解决方案似乎都难以记忆或太复杂,我发现使用printf最短的解决方案:

$ printf '%x\n' 256
100
Run Code Online (Sandbox Code Playgroud)

[编辑]

但正如评论中所指出的,这不是作者想要的,所以下面的公平是完整答案.

...使用上面输出实际的二进制数据流:

printf '%x\n' $(cat /dev/urandom | head -c 5 | od -An -vtu1)
Run Code Online (Sandbox Code Playgroud)

它能做什么:

  • 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
Run Code Online (Sandbox Code Playgroud)

或者为了测试单个二进制字节,在输入时让我们给出61十进制('='char)来产生二进制数据('\\x%x'格式化它),上面的命令将正确输出3d(十进制61):

$printf '%x\n' $(echo -ne "$(printf '\\x%x' 61)" | head -c 5 | od -An -vtu1)
3d
Run Code Online (Sandbox Code Playgroud)


Kev*_*Cox 5

If you need a large stream (no newlines) you can use tr and xxd (part of Vim) for byte-by-byte conversion.

head -c1024 /dev/urandom | xxd -p | tr -d $'\n'
Run Code Online (Sandbox Code Playgroud)

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

head -c1024 /dev/urandom | hexdump '-e"%x"'
Run Code Online (Sandbox Code Playgroud)

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

  • 使用`echo abc | hexdump -e '/1 "%02x"'` 获取网络顺序,0x0a 为 0。 (2认同)