od(1)的反义词是什么?

时间:2009-04-27 19:17:30

标签: linux command-line

说我有8b1f 0008 0231 49f6 0300 f1f3 75f4 0c72 f775 0850 7676 720c 560d 75f0 02e5 ce00 0861 1302 0000 0000,如何在不复制+粘贴到十六进制编辑器的情况下轻松获取二进制文件?

5 个答案:

答案 0 :(得分:14)

使用:

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

答案 1 :(得分:4)

请参阅xxd

答案 2 :(得分:1)

所有目前的答案都指的是方便的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 / network-order(例如由od -t x1 -An -v创建的),并且可能会转换为big-endian输出。我假设xxd只是假定默认,如果没有另外说明,这个解决方案也是这样做的。如果需要字节交换,你如何进行字节交换也取决于系统的字大小(例如32位,64位)和非常很少字节大小(你几乎总是假设8位字节 - 八位字节 - 但是。)

以下函数使用binary -> od -> binary技巧的更复杂版本来移植bytewap二进制数据,以系统字节顺序为基础,并考虑系统字大小。该算法适用于任何高达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

答案 3 :(得分:0)

这是扭转“od”输出的方法:

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

答案 4 :(得分:0)

此版本也适用于二进制格式:

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

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