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

问题描述 投票:56回答:8

我想把二进制数据转换成十六进制,就是这样,没有花哨的格式化之类的。hexdump 这似乎太聪明了,而且它对我来说是 "过度格式化"。我想从devrandom中提取x个字节,然后以十六进制的形式传递给他们。

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

linux scripting hexdump
8个回答
71
投票

也许可以使用 xxd:

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

36
投票

小心!

hexdumpxxd 给不同的恩迪内斯的结果!

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

http:/geekandpoke.typepad.com.a6a00d8341d3df553ef01543533e604970c-800wi。 :D


24
投票

使用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.orgwikiHex_dump#od_and_hexdump。: "根据你的系统类型,这两个工具中的一个或两个都是可用的--BSD系统不支持hexdump,GNU系统则相反。"


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

你甚至可以把这个小的C程序嵌入到shell脚本中 使用heredoc语法.


8
投票

所有的解决方法似乎都很难记或者太复杂,我觉得用 printf 最短的一个。

$ printf '%x\n' 256
100

[编辑]

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

......用上面的方法来输出实际的二进制数据流。

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

它的作用是什么?

  • printf '%x\n' ...... - 打印一个整数序列,即:'%x'。printf '%x,' 1 2 3,将打印 1,2,3,
  • $(...)--这是一种获取某些shell命令的输出并进行处理的方法。
  • cat /dev/urandom - 它输出随机的二进制数据
  • head -c 5 - 二进制数据限制为5字节
  • od -An -vtu1 - 八进制转储命令,将二进制转换为十进制。

作为测试用例('a'是61个十六进制,'p'是70个十六进制,...)。

$ printf '%x\n' $(echo "apple" | head -c 5 | od -An -vtu1)
61
70
70
6c
65

或者测试单个的二进制字节, 输入61个十进制('='char)产生二进制数据('='char)。'\\x%x' 格式),上面的命令将正确输出3D(十进制61)。

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

4
投票

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

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

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

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

注意,区别在于endianness。


3
投票

dd+hexdump也可以。

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

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
© www.soinside.com 2019 - 2024. All rights reserved.