在 Unix shell 中,如何以机器端顺序从十六进制字符串转换为标准输出字节

问题描述

我想运行类似于以下内容的命令:

# echo 00: 0123456789abcdef | xxd -r | od -tx1
0000000 01 23 45 67 89 ab cd ef
0000010

也就是说,我想输入一个十六进制字符串并将其转换为标准输出上的字节。但是,我希望它尊重我所在机器的字节顺序,这是小端。证据如下:

# lscpu | grep Byte.Order
Byte Order:            Little Endian

所以,如果我的机器是大端的,我希望它像上面一样工作。但事实并非如此,我想看看:

# <something different here> | od -tx1
0000000 ef cd ab 89 67 45 23 01
0000010

现在,xxd 有一个“-e”选项来表示小字节序。但是 1) 我想要机器字节序,因为我想要一些可以在大字节序或小字节序机器上运行的东西,并且 2) "-e" 无论如何都不支持 "-r"。

谢谢!

解决方法

这个怎么样——

$ echo 00: 0123456789abcdef | xxd -r | xxd -g 8 -e | xxd -r | od -tx1
0000000    ef  cd  ab  89  67  45  23  01
0000010

根据man xxd

  • -e

    切换到 little-endian 十六进制转储。此选项将字节组视为采用 little-endian 字节顺序的字。可以使用 4 更改 -g 字节的默认分组。此选项仅适用于 hexdump,保持 ASCII(或 EBCDIC)表示不变。命令行开关 -r-p-i 不适用于此模式。

  • -g 字节 | -groupsize 字节

    用空格分隔每个 bytes 字节(每个两个十六进制字符或八个位数字)的输出。指定 -g 0 以禁止分组。 Bytes 在普通模式下默认为 2,在小端模式下默认为 4,在位模式下默认为 1。分组不适用于 postscriptinclude 样式。