为什么 xxd 命令反向操作时不尊重字节分组?

为什么 xxd 命令反向操作时不尊重字节分组?

我正在尝试在脚本中将字节写入系统上的文件,并决定使用 xxd(带 -r)来实现此目的。但是,我希望它考虑每 4 个字节的字节顺序。下面是我用来测试此操作的一个例子:

 echo "1122334455667788" | xxd -r -p -g 4  - outfile

当我这样做时,我得到以下输出hexdump outfile

 0000000 2211 4433 6655 8877                    
 0000008

因为我使用了-g 4,所以我期望结果是这样的

 0000000 4433 2211 8877 6655                    
 0000008

它的表现与我预期的不一样。我做错了什么?

编辑:

我现在意识到 -g 不应该改变字节顺序。但是,xxd 确实考虑了字节顺序,就像我提供的示例一样。现在的问题是,我如何让 xxd 以 4 个字节(32 位小端值)为一组而不是每 2 个字节翻转一次字节,以获得我想要的结果?仅使用 xxd 是否可能?

答案1

因为该-g选项旨在用于直接(而非反向)转换,并且仅用于格式化用户所见的输出:

$ printf '\x20\x21\x22\x23\x24\x25\x26\x27\n' 
 !"#$%&'

$ printf '\x20\x21\x22\x23\x24\x25\x26\x27\n' | xxd
00000000: 2021 2223 2425 2627 0a                    !"#$%&'.

$ printf '\x20\x21\x22\x23\x24\x25\x26\x27\n' | xxd -g 4
00000000: 20212223 24252627 0a                  !"#$%&'.

为了获得字节值的表示以改变最高有效位的顺序,您需要一个实际上可以进行转换的工具:

printf '\x20\x21\x22\x23\x24\x25\x26\x27\n' | od -An -tx4 
 23222120 27262524 0000000a

然后使用 xxd 将这些字节值反转为实际字节:

printf '\x20\x21\x22\x23\x24\x25\x26\x27\n' | od -An -tx4 | xxd -r -p
#"! '&%$

请注意,每四个字节的组中各个字节的顺序已经被反转。

相关内容