2009-04-27 7 views
6

私は8b1f 0008 0231 49f6 0300 f1f3 75f4 0c72 f775 0850 7676 720c 560d 75f0 02e5 ce00 0861 1302 0000 0000と言っていますが、ヘキサエディタに貼り付け+貼り付けを行わずに簡単にバイナリファイルを取得できますか?od(1)の反対は何ですか?

+0

単純なスクリプトまたはプログラムを作成して実行します。 C言語の5-10行、または他の言語を使用できます。取引を終えた。 –

+0

ここでは、ソリューションのロットのこの問題にコードゴルフの質問です:http://stackoverflow.com/questions/795027/code-golf-hex-to-raw-binary-conversion – dertoni

答えて

12

用途:

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

xxdを参照してください。

0

が逆転するための方法ですが、出力を "OD":

echo "test" | od -A x -t x1 | sed -e 's|^[0-f]* ?||g' | xxd -r 
test 
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のテキストファイルを扱っている場合です... とエンディアンの違いを防ぐためバイト単位で処理します異なるシステム上でパイプの一部を実行している場合

1

すべての現在の回答は便利なxxd -rのアプローチを参照していますが、ここでxxdが利用できない、または便利でない場合は、POSIXシェル構文のみを使用して、移植性が高く(より柔軟で、ちなみに

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を使用します。アルゴリズムは72bitワード・サイズまで何のために働く(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 
関連する問題