用于反转字节顺序/更改字节顺序的命令行
我在一些脚本中乱砍,试图解析由Javas DataOutputStream#writeLong(...)
编写的一些数据。 由于java似乎总是写大端,我在将字节输入od
遇到问题。 这是因为od
总是假设endianess与你当前所在的arch的endianess相匹配,而且我在一个小端机器上。
我正在寻找一个简单的单行程来反转字节顺序。 假设你知道文件的最后8个字节是由前面提到的writeLong(...)
方法写的长的。 我目前打印这篇文章的最佳尝试是
tail -c 8 file | tac | od -t d8
,但是tac
似乎只对文本起作用(足够公平)。 我发现了一些对dd conv=swab
引用,但这只是成对交换字节,并且不能反转这8个字节。
有谁知道这个好的单行程?
最终到了Perl。 使用我在PERL One Liners找到的单线 :
tail -c 8 file | perl -0777e 'print scalar reverse <>' | od -t d8
0777
分隔符char对我来说有点令人费解,但debian admin的这个页面似乎暗示它是’无记录分隔符’的占位符,触发每个字节完整的反向字节。
其他建议是受欢迎的。
编辑:在评论tac.c中找到另一个命令,我从GNU coreutils下载:
如果没有给出任何文件,或者遇到FILE名称“ – ”,则将每个文件或标准输入复制到标准输出,并反转记录的顺序。 记录由字符串实例分隔,如果没有给出,则换行符。 默认情况下,分隔符字符串附加到它在文件中跟随的记录的末尾。
选项:-b, – before分隔符附加到文件前面的记录的开头。 -r, – regex分隔符是正则表达式。 -s, – separator = separator使用SEPARATOR作为记录分隔符。
要逐字节地反转文件,请使用(在bash,ksh或sh中): tac -r -s’。 ‘档案
你可以使用objcopy:
$ objcopy -I binary -O binary --reverse-bytes=num inputfile.bin outputfile.bin
其中num为2或4。
注意下一版本的GNU coreutils(> = 8.23)会在od命令中添加–endian = {little,big}选项
我想出了这个Perl单行程序,将4字节整数从一个字节序转换为另一个字节序:
$ perl -e 'open F,shift; do { read(F,$a,4); print scalar reverse($a);} while(!eof(F));' bigend.bin > littlend.bin
这可能在真正的Linux机器上工作正常,但是Cygwin最终给我的位置,将二进制文件视为文本并在每个0x0A字节(也称为换行符)之前插入0x0D(也就是CR)。 但如果你管cat -
它似乎不管它。 这对我有用:
$ perl -e 'open F,shift; do { read(F,$a,4); print scalar reverse($a);} while(!eof(F));' bigend.bin | cat - > littlend.bin
BASH:
od -b -v -w8 | while read pfx b8 ; do [ "$b8" ] && echo -n 12345678 | tr 87654321 \\${b8// /\\} ; done
为了更加健壮,取决于od
的输出样式,它可能需要压缩空格(在w8
之后插入"| sed 's/ */ /g'"
)。
用过dd,卢克!
dd if=sourcefile of=resultfile conv=swab