od(1)的相反之处是什么?

说我有8b1f 0008 0231 49f6 0300 f1f3 75f4 0c72 f775 0850 7676 720c 560d 75f0 02e5 ce00 0861 1302 0000 0000,我怎么能轻松地得到一个二进制文件,而不复制+粘贴到hex编辑器?

Solutions Collecting From Web of "od(1)的相反之处是什么?"

使用:

% xxd -r -p in.txt out.bin 

见xxd 。

所有现在的答案都提到了方便的xxd -r方法,但是对于xxd不可用或不方便的情况,这里使用的只是POSIX shell语法(更灵活,但更冗长和效率更低)的解决方案补偿输入的奇数位数):

 un_od() { printf -- "$( tr -d '\t\r\n ' | sed -e 's/^(.(.{2})*)$/0\1/' -e 's/\(.\{2\}\)/\\x\1/g' )" } 

顺便说一下:你不指定你的输入是big-endian还是little-endian,或者你想要big / little-endian输出。 通常在你的问题中的输入将是big-endian /网络顺序(例如由od -t x1 -An -v创建),并且将被期望转换为大端输出。 我认为xxd只是假定如果没有告知,默认情况下,这种解决方案也是如此。 如果需要进行字节交换,那么如何进行字节交换还取决于系统的字长(例如32位,64位),很少有字节大小(尽管您几乎总是假定8位字节 – 八位字节) 。

下面的函数使用一个更复杂的binary -> od -> binary版本binary -> od -> binary技巧来移植二进制字节数据,以系统字节序为条件,并考虑系统字大小。 该算法适用于任何高达72位的字长(因为seq -s '' 10 – > 12345678910不起作用):

 if { sed --version 2>/dev/null || :; } | head -n 1 | grep -q 'GNU sed'; then _sed() { sed -r "${@}"; } else _sed() { sed -E "${@}"; } fi sys_bigendian() { return $( printf 'I' | od -t o2 | head -n 1 | \ _sed -e 's/^[^ \t]+[ \t]+([^ \t]+)[ \t]*$/\1/' | cut -c 6 ) } sys_word_size() { expr $(getconf LONG_BIT) / 8; } byte_swap() { _wordsize=$1 od -An -v -t o1 | _sed -e 's/^[ \t]+//' | tr -s ' ' '\n' | \ paste -d '\\' $(for _cnt in $(seq $_wordsize); do printf -- '- '; done) | \ _sed -e 's/^/\\/' -e '$ s/\\+$//' | \ while read -r _word; do _thissize=$(expr $(printf '%s' "$_word" | wc -c) / 4) printf '%s' "$(seq -s '' $_thissize)" | tr -d '\n' | \ tr "$(seq -s '' $_thissize -1 1)" "$_word" done unset _wordsize _prefix _word _thissize } 

您可以使用上述内容以bigendian格式输出文件内容,而不管系统字节顺序如何:

 if sys_bigendian; then cat /bin/sh else cat /bin/sh | byte_swap $(sys_word_size) fi 

以下是反转“od”输出的方法:

 echo "test" | od -A x -t x1 | sed -e 's|^[0-f]* ?||g' | xxd -r test 

这个版本也将使用二进制格式:

 cat /bin/sh \ | od -A n -v -t x1 \ | tr -d '\r' \ | xxd -r -g 1 -p1 \ | md5sum && md5sum /bin/sh 

额外的'\ r'就是如果你正在处理w / dos文本文件…并逐字节处理,以防止在不同的系统上运行管道部分的endians差异。