63

我想将二进制数据转换为十六进制,仅此而已,没有花哨的格式等等。hexdump似乎太聪明了,对我来说它“过度格式化”。我想从 /dev/random 中取出 x 个字节并将它们作为十六进制传递。

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

4

9 回答 9

81

也许使用xxd

% xxd -l 16 -p /dev/random
193f6c54814f0576bc27d51ab39081dc
于 2011-06-09T12:22:04.033 回答
43

小心!

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

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

简单解释。大端与小端:D

于 2012-01-16T00:30:38.843 回答
26

使用od(GNU 系统):

$ echo abc | od -A n -v -t x1 | tr -d ' \n'
6162630a

使用hexdumpBSD系统):

$ echo abc | hexdump -ve '/1 "%02x"'
6162630a

十六进制转储, od 和 hexdump

“根据您的系统类型,这两个实用程序中的一个或两个都将可用——BSD 系统弃用 od 用于 hexdump,GNU 系统则相反。”

于 2012-07-24T22:38:34.440 回答
11

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

于 2011-06-09T12:31:07.810 回答
10

所有的解决方案似乎都难以记忆或过于复杂。我发现使用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
于 2016-10-04T14:50:45.860 回答
5

如果你需要一个大流(没有换行符),你可以使用trand xxd(Vim 的一部分)进行逐字节转换。

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

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

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

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

于 2013-11-12T18:35:36.610 回答
3

dd + hexdump也可以:

dd bs=1 count=1 if=/dev/urandom 2>/dev/null  | hexdump -e '"%x"'
于 2011-06-09T12:32:40.513 回答
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=12and$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
于 2015-11-16T00:48:23.017 回答
1

如果您针对多个平台,有时 perl5 的可移植性会更好。它随每个 Linux 发行版和 Unix 操作系统一起提供。您通常可以在容器映像中找到它,而其他工具(如 xxd 或 hexdump)不可用。下面是如何在 Perl 中做同样的事情:

$ head -c8 /dev/urandom | perl -0777 -ne 'print unpack "H*"'
5c9ed169dabf33ab

$ echo -n $'\x01\x23\xff' | perl -0777 -ne 'print unpack "H*"'
0123ff

$ echo abc | perl -0777 -ne 'print unpack "H*"'
6162630a

请注意,这会更多地使用 slurp,这会导致 Perl 将整个输入读入内存,当输入很大时,这可能不是最优的。

于 2022-02-15T01:17:07.617 回答