用于反转字节顺序/更改字节顺序的命令行

Ale*_*ing 12 java swap endianness dataoutputstream

我在一些脚本中乱砍,试图解析Javas编写的一些数据DataOutputStream#writeLong(...).由于java似乎总是写大端,我在将字节输入时遇到问题od.这是因为od总是假设endianess与你当前所在的arch的endianess匹配,而且我在一个小端机器上.

我正在寻找一个简单的单行程来反转字节顺序.假设你知道文件的最后8个字节是由前面提到的writeLong(...)方法编写的.我目前打印这篇文章的最佳尝试是

tail -c 8 file | tac | od -t d8
Run Code Online (Sandbox Code Playgroud)

,但tac似乎只对文本有效(足够公平).我找到了一些引用dd conv=swab,但这只是成对交换字节,并且不能反转这八个字节.

有谁知道这个好的单行程?

小智 10

用过dd,卢克!

dd if=sourcefile of=resultfile conv=swab
Run Code Online (Sandbox Code Playgroud)

  • 这可以完成短(16 位)而不是长(64 位)的工作,不是吗? (3认同)

Ale*_*ing 8

最终到了Perl.使用我在PERL One Liners找到的单线:

tail -c 8 file | perl -0777e 'print scalar reverse <>' | od -t d8
Run Code Online (Sandbox Code Playgroud)

0777分离器字符是一个有点令人费解给我,但这个页面在Debian的管理员似乎表明,它是"无记录分隔符"占位符,引发了完整的反向字节每字节.

其他建议是受欢迎的.

编辑:在评论tac.c中找到另一个命令,我从GNU coreutils下载:

如果没有给出FILE或标准输入,或者遇到FILE名称" - ",则将每个文件或标准输入复制到标准输出,并反转记录的顺序.记录由字符串实例分隔,如果没有给出,则换行符.默认情况下,分隔符字符串附加到它在文件中跟随的记录的末尾.

选项:-b, - before分隔符附加到文件前面的记录的开头.-r, - regex分隔符是正则表达式.-s, - separator = separator使用SEPARATOR作为记录分隔符.

要逐字节地反转文件,请使用(在bash,ksh或sh中): tac -r -s'.'档案


小智 8

你可以使用objcopy:

$ objcopy -I binary -O binary --reverse-bytes=num inputfile.bin outputfile.bin
Run Code Online (Sandbox Code Playgroud)

其中num为2或4.