从二进制转换为十六进制并返回

从二进制转换为十六进制并返回

给定一个二进制文件,如何在已安装的最小系统上仅使用sed和等标准工具将其转换为十六进制字符串并返回?cutbusybox

这些工具是不是可用的:

  • perl
  • python
  • xxd(vim自带)
  • gcc

hexdump自带一个命令busybox,但是和自带的不一样util-linux

我正在寻找一个脚本或命令来将文件转换为十六进制字符串,以及相应的脚本或命令将其转换回二进制。中间格式不必是十六进制,它可以是 base64 或其他格式。

这适用于磁盘空间有限的嵌入式设备。

答案1

这是我想到的(基于几个在线资源和一些实验)。

从十六进制转换为二进制 ( hex2bin):

#!/bin/sh
sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' "$1" | xargs printf

从 bin 转换为 hex ( bin2hex):

#!/bin/sh
hexdump -v -e '1/1 "%02x"' "$1"

使用示例:

./bin2hex binary_file_1 | ./hex2bin - > binary_file_2
diff -s binary_file_1 binary_file_2

这适用于 busybox,但遗憾的是 hex2bin 受到 给定参数的最大长度的限制xargs,因此此方法仅适用于小文件(在我的桌面系统上小于 32 KiB)。

答案2

POSIXly(并且仅使用兼容的公共子集busybox(或至少是busybox为当前busyboxDebian 软件包构建的):

  • bin2hex

    (
      export LC_ALL=C
        od -An -vtx1 |
        tr -s ' \t\n' '\n\n\n' |
        grep .
    )
    

    (每行一个十六进制)

  • hex2bin

    (
      export LC_ALL=C
        awk '
          BEGIN{
            for (i = 0; i < 256; i++)
              c[sprintf("%02x", i)] = sprintf("%o", i)
          }
          NR % 200 == 1 {printf "%s", end "printf '\''"; end = "'\''\n"}
          {printf "\\%s", c[$0]}
          END {print end}' |
        sh
    )
    

如果您的busybox与 Debian 的相反,是在没有桌面选项,则-An-tx1选项将od不可用。您可以使用od -b它来代替,它将提供带有八进制偏移量的一字节八进制转储。od -b是 Unix 但不是 POSIX,所以不能在所有类 Unix 系统上工作。

bin2hex会成为:

(
  export LC_ALL=C
    od -b |
    awk '
      BEGIN{
        for(i = 0; i < 256; i++)
          hex[sprintf("%03o", i)] = sprintf("%02x", i)
      }
      NF > 1 {for (i = 2; i<= NF; i++) print hex[$i]}'
)

再次强调,仅使用 Debian 的 busybox 进行测试,我无法判断其中有多少依赖于某些busybox编译时选项或其他选项。您必须在目标系统上进行测试。

答案3

您的 busybox 可能是用小程序构建的64位基数所以你可以做

busybox base64 <bin >txt
busybox base64 -d <txt >bin

或者,如果没有,您可能会拥有令人尊敬的uu编码乌德码,也可以选择-m以十六进制编码。例如

echo -n abcABC | busybox uuencode -m - | busybox uudecode - 

列出带有 的内置小程序busybox --list

相关内容