我正在破解一些脚本,试图解析Javas DataOutputStream#writeLong(...)
写的一些数据。由于java似乎总是写big endian,所以我在向od
提供字节时遇到了问题。这是因为od
总是假设字节序与您当前使用的arch的字节序匹配,而我使用的是一个little endian机器。
我正在寻找一个简单的单行程序来反转字节顺序,假设您知道一个文件的最后8个字节是由前面提到的writeLong(...)
方法编写的long,我目前打印这个long的最佳尝试是
tail -c 8 file | tac | od -t d8
,但是tac
似乎只对文本有效(很公平),我发现了一些对dd conv=swab
的引用,但是这只能成对地交换字节,并且不能反转这八个字节。
有人知道一个好的俏皮话吗?
7条答案
按热度按时间mutmk8jj1#
您可以使用objcopy:
其中num是2或4。
kse8i1jr2#
最后求助于Perl,使用了我在PERL One Liners找到的一行程序:
0777
分隔符对我来说有点费解,但是debian admin的this页面似乎暗示它是“无记录分隔符”的占位符,触发了一个完全相反的逐字节。欢迎提出其他建议。
编辑:在tac. c的注解中发现了另一个命令,我从GNU coreutils下载了这个命令:
将每个文件或标准输入(如果未给定或遇到文件名“-”)复制到标准输出,并颠倒记录的顺序。记录由字符串示例分隔,如果未给定,则由换行符分隔。默认情况下,分隔符字符串附加到文件中它所跟随的记录的末尾。
选项:-B,--before分隔符附加到文件中它前面的记录的开头。-r,--regex分隔符是正则表达式。-s,--separator=separator使用SEPARATOR作为记录分隔符。
要逐字节反转文件,请使用(在bash、ksh或sh中):tac -r -s“.|”文件
xxb16uws3#
用过dd卢克!
xv8emn3q4#
注意,下一个版本的GNUcoreutils(〉= 8.23)将在od命令中添加--endian={little,big}选项
3j86kqsm5#
我提出了这个Perl一行程序,用于将4字节整数从一种字节序转换为另一种字节序:
这在真实的的Linux机器上可能工作得很好,但是Cygwin最后咬了我一口,把二进制文件当作文本,并在每个0x0A字节(又称换行符)之前插入一个0x0D(又称CR)。但是如果你用管道连接到
cat -
,它似乎不去管它。ni65a41a6#
巴斯:
根据
od
的输出样式,为了更健壮一些,它可能需要压缩空格(在w8
之后插入"| sed 's/ */ /g'"
)。2admgd597#
xxd
有两个标志-e
和-g
可供您使用。这样,您可以执行以下操作: