od(1) 的相反数是什么?

问题描述 投票:0回答:5

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

linux command-line
5个回答
17
投票

用途:

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

4
投票

参见xxd


2
投票

目前的所有答案都指的是方便的

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'
    )"
}

顺便说一下:您没有指定您的输入是大端还是小端,或者您是否想要大/小端输出。通常,您的问题中的输入将是大端/网络顺序(例如,由

od -t x1 -An -v
创建),并且预计会转换为大端输出。我认为
xxd
只是假设如果没有另外说明的话默认,并且这个解决方案也这样做。如果需要字节交换,如何进行字节交换还取决于系统的字大小(例如,32 位、64 位),并且很少取决于字节大小(您几乎总是可以假设 8-位字节 - 八位字节 - 不过)。 以下函数使用更复杂版本的

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
}

您可以使用上面的方法以大尾数格式输出文件内容,而不管系统尾数:

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



1
投票

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

额外的'
' 只是如果您正在处理 
DOS

文本文件...... 如果在不同系统上运行管道的各个部分,则逐字节处理以防止endianness差异。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.