是否有一个oneliner将二进制文件从Little Endian转换为Big Endian?


14

反之亦然。

如果相关,我正在运行RedHat。


6
什么类型的二进制文件?
斯特凡Chazelas

1
无论如何,对于任何文件格式,我相信您都可以使用Perl和pack / unpack编写单行代码以转换其字节序。对于某些格式,它将比其他格式更长。;-)
Ilmari Karonen 2015年

Answers:


34

您无法执行此操作,因为对于这种转换,您需要了解二进制内容的含义。

例如,如果二进制文件中有字符串,则不得转换,并且4字节整数可能需要与2字节整数不同的处理方式。

换句话说,对于字节顺序转换,您需要数据类型描述。


7
我只是这么说。它不只是交换每对字节那么简单。例如,bigendian中的4字节整数01 02 03 04在little endian中可能看起来像这样04 02 03 01 NOT 02 01 04 03 cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html
Rob

1
同意,在原始的无类型字节流上,字节序没有意义...如果OP不编辑他的问题,这应该是可接受的答案
Thomas

[需要引用]-AFAIK,除非应用程序明确保留某些字节顺序而不保留其他字节顺序,否则通常会始终对字节或单词进行一致的排序。
暂停,直到另行通知。

1
@DennisWilliamson:UTF-8或ASCII字符串不具有字节序。UTF-8指定字节顺序,而ASCII为7位并且没有多字节令牌。UTF-16字符串确实具有字节序,并且可能具有也可能没有BOM标记该字节序。旨在与Windows或Java进行交互的Unix二进制文件可能同时具有两种类型的字符串,这意味着在转换时必须区分它们。
凯文

我来这里是为了寻找一个程序,您可以在其中提供数据描述和数据,然后将其转换。到目前为止,我还没有找到这样的程序,但这并不意味着它无法完成。
Levi Morrison

32

您可以使用进行字节交换dd。足够了吗?如果没有,请更新您的问题以提供输入文件和预期输出文件的示例。

echo hello >infile
dd conv=swab <infile >outfile

hex infile
   0000 68 65 6c 6c 6f 0a                                 hello.
hex outfile
   0000 65 68 6c 6c 0a 6f                                 ehll.o

2

如果您不关心文件内容而只想交换字节,请尝试endconv。它只是标准字节转换函数的包装器,因此它支持2、4和8字节长整数的转换。它不是一个班轮,因为它是单独的程序。


0

为了更改文件的字节序,假定字(32位)大小,此1个衬纸应为您工作:

hexdump -v -e '1/4 "%08x"' -e '"\n"' input_file | xxd -r -p > output_file
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.