xxd -ps
16進形式で見ているバイナリデータがあります。区切り記号付きの2つのヘッダー間のバイト距離は48300(= 805 * 60)バイトですfafafafa
。ファイルの先頭をスキップする必要があります。
fafafafaヘッダーの間に48300バイトの16進データの例を取得できます。ここと言うデータ2015.6.26.txtこれらのヘッダーの3つとほぼ同等のバイナリここと言うtest_27.6.2015.bin最初の2つのヘッダーしかありません。どちらのファイルでも、最後のヘッダーのデータは全長ではありません。そうでなければ、バイトオフセット、すなわちヘッダ間のデータ長が固定されていると仮定することができる。
アルゴリズム擬似コード
- タイトルの終わりを確認してください。
- 最初の2つのタイトル位置を見て、その位置の違いを設定します(d2-d1)イベント間の距離は固定されています(777)。
- バイト位置別にデータを分割する(777) - TODOバイナリ形式に分割する必要がありますか、または
xxd -ps
変換されたデータを分割する必要がありますか?バイト位置別(777)
xxd -r
同様の方法でデータをバイナリに変換できますが、xxd -ps | split and store | xxd -r
これが必要かどうかはまだわかりません。
どの段階でバイナリデータを分割できますか?xxd -ps
変換された形式またはバイナリデータのみが使用されます。
変換された形式に分割する場合、xxd -ps
forループがファイルを繰り返す唯一の方法だと思います。可能な分割ツールcsplit
、split
...、わからない。しかし、わかりません。
grep(ggrepはgnu grep)16進データ出力
$ xxd -ps r328.raw | ggrep -b -a -o -P 'fafa' | head
49393:fafa
49397:fafa
98502:fafa
98506:fafa
147611:fafa
147615:fafa
196720:fafa
196725:fafa
245830:fafa
245834:fafa
バイナリファイルで同様のgrepを実行すると、空行のみが出力されます。
$ ggrep -b -a -o '\xfa' r328.raw
文書
私に合った文書を見つけましたここ次の図は、一般的なSRSデータ型です。
どの段階でバイナリデータを分割できますか(バイナリデータまたはxxd -ps
変換データに)。
答え1
xxdを介さずにバイナリファイルを操作できます。私はxxdを介してあなたのデータを再実行し、それを使用してgrep -b
私に示しました。バイトオフセット\xfa
バイナリファイルのパターン(16進数から文字に変換)
sed
出力から一致する文字を削除し、数字だけを残しました。次に、シェル位置引数を結果オフセット(set --
...)に設定します。
xxd -r -p <data26.6.2015.txt >/tmp/f1
set -- $(grep -b -a -o -P '\xfa\xfa\xfa\xfa' /tmp/f1 | sed 's/:.*//')
これで$ 1、$ 2、...にオフセットリストがあります。その後、ddを使用して目的の部分を抽出し、ブロックサイズを1(bs=1
)に設定してバイト単位で読み取ることができます。skip=
入力からスキップするバイト数とcount=
コピーするバイト数を示します。
start=$1 end=$2
let count=$end-$start
dd bs=1 count=$count skip=$start </tmp/f1 >/tmp/f2
上記の内容は、第1パターンの先頭から第2パターンの前まで抽出される。パターンを含めない場合は、最初に4を追加します(数は4ずつ減ります)。
すべての部分を抽出するには、同じコードのループを使用し、開始オフセット0と終了オフセットファイルサイズを数値リストに追加します。
xxd -r -p <data26.6.2015.txt >/tmp/f1
size=$(stat -c '%s' /tmp/f1)
set -- 0 $(grep -b -a -o -P '\xfa\xfa\xfa\xfa' /tmp/f1 | sed 's/:.*//') $size
i=2
while [ $# -ge 2 ]
do start=$1 end=$2
let count=$end-$start
dd bs=1 count=$count skip=$start </tmp/f1 >/tmp/f$i
let i=i+1
shift
done
grepがバイナリデータを処理できない場合は、xxdを使用してデータを16進ダンプできます。まず、すべての改行を削除して1つの大きな行を取得し、エスケープされていない16進値でgrepを実行し、すべてのオフセットを2で除して元のファイルにddを実行します。
xxd -r -p <data26.6.2015.txt >r328.raw
tr -d '\n' <data26.6.2015.txt >f1
let size2=2*$(stat -c '%s' f1)
set -- 0 $(grep -b -a -o -P 'fafafafa' f1 | sed 's/:.*//') $size2
i=2
while [ $# -ge 2 ]
do let start=$1/2
let end=$2/2
let count=$end-$start
dd bs=1 count=$count skip=$start <r328.raw >f$i
let i=i+1
shift
done
答え2
すごいミューに出力回答その人はどこでデータを使用しますか?データ2015.6.26.txt。
#1
$ cat 27.6.2015_1.sh && sh 27.6.2015_1.sh
xxd -r -p <data26.6.2015.txt >/tmp/f1
size=$(stat -c '%s' /tmp/f1)
pat=$(echo -e '\xfa\xfa\xfa\xfa')
set -- 0 $(ggrep -b -a -o "$pat" /tmp/f1 | sed 's/:.*//') $size
i=2
while [ $# -ge 2 ]
do start=$1 end=$2
let count=$end-$start
dd bs=1 count=$count skip=$start </tmp/f1 >/tmp/f$i
let i=i+1
shift
done
72900+0 records in
72900+0 records out
72900 bytes (73 kB) copied, 0.160722 s, 454 kB/s
#2
$ cat 27.6.2015_2.sh && sh 27.6.2015_2.sh
xxd -r -p <data26.6.2015.txt >/tmp/f1
size=$(stat -c '%s' /tmp/f1)
set -- 0 $(ggrep -b -a -o -P '\xfa\xfa\xfa\xfa' /tmp/f1 | sed 's/:.*//') $size
i=2
while [ $# -ge 2 ]
do start=$1 end=$2
let count=$end-$start
dd bs=1 count=$count skip=$start </tmp/f1 >/tmp/f$i
let i=i+1
shift
done
72900+0 records in
72900+0 records out
72900 bytes (73 kB) copied, 0.147935 s, 493 kB/s
#サム
$ cat 27.6.2015_3.sh && sh 27.6.2015_3.sh
xxd -r -p <data26.6.2015.txt >r328.raw
tr -d '\n' <data26.6.2015.txt >f1
let size2=2*$(stat -c '%s' f1)
set -- 0 $(ggrep -b -a -o -P 'fafafafa' f1 | sed 's/:.*//') $size2
i=2
while [ $# -ge 2 ]
do let start=$1/2
let end=$2/2
let count=$end-$start
dd bs=1 count=$count skip=$start <r328.raw >f$i
let i=i+1
shift
done
24292+0 records in
24292+0 records out
24292 bytes (24 kB) copied, 0.088345 s, 275 kB/s
24152+0 records in
24152+0 records out
24152 bytes (24 kB) copied, 0.061246 s, 394 kB/s
24152+0 records in
24152+0 records out
24152 bytes (24 kB) copied, 0.058611 s, 412 kB/s
304+0 records in
304+0 records out
304 bytes (304 B) copied, 0.001239 s, 245 kB/s
出力は16進ファイル1個とバイナリファイル4個です。
$ less f1
$ less f2
"f2" may be a binary file. See it anyway?
$ less f3
"f3" may be a binary file. See it anyway?
$ less f4
"f4" may be a binary file. See it anyway?
$ less f5
"f5" may be a binary file. See it anyway?
data26.6.2015.txtファイルには3つのヘッダーしか提供されていないため、fafafafaを含むファイルは3つだけでなければなりません。ここで最後のヘッダの内容はスタブです。 f2-f5の出力:
$ xxd -ps f2 |head -n3
48000000fe5a1eda480000000d00030001000000cd010000010000000000
000000000000000000000000000000000000000000000100000001000000
ffffffff57ea5e5580510b0048000000fe5a1eda480000000d0003000100
$ xxd -ps f3 |head -n3
fafafafa585e0000fe5a1eda480000000d00030007000000cd0100000200
000000000000020000000000008000000000000000000000000000000000
01000000ffffffff72ea5e55b2eb0900105e000016000000010000000000
$ xxd -ps f4 |head -n3
fafafafa585e0000fe5a1eda480000000d00030007000000cd0100000300
000000000000020000000000008000000000000000000000000000000000
01000000ffffffff72ea5e55f2ef0900105e000016000000010000000000
$ xxd -ps f5 |head -n3
fafafafa585e0000fe5a1eda480000000d00030007000000cd0100000400
000000000000020000000000008000000000000000000000000000000000
01000000ffffffff72ea5e55a9f10900105e000016000000010000000000
どこ
- f1 は完全なデータファイルです。データ2015.6.26.txt(含む必要はありません)
- f2 はファイルヘッダ、つまりファイルの先頭です。データ2015.6.26.txt最初のタイトルまで髪の毛髪(含む必要はありません)
- f3 が最初のヘッダーです。そうですね!
- f4は2番目のヘッダです。そうですね!
- f5は3番目のヘッダです。そうですね!
答え3
難しくありません。開始文字列を見つけて名前を付け、末尾の文字列を一致させるだけです。そうでない場合は、少なくとも近くに近づいてみてください。実際、すべての16進数は必要ではありませんが、次のように使用してください。
fold -w2 <hexfile |
sed -e:t -e's/[[:xdigit:]]\{2\}$/\\x&/
/f[af]$/N;/\(.\)..\1$/!s/.*\n/&\\x/;t
/^.*\(.\)\(\n.*\)\n\(.*\n\).*/!bt
s//\3\3\3 H_E_A_D \1 E_N_D \2\2\2/
s/.* f//;s/a E.*//'
\x
これにより、各バイトに対して1行に16進数のバイトコードが表示されます(接頭辞付き)。hexfile
とは別にバイトコードは順番に4回fa
表示されます。ff
この場合、H_E_A_D
またはE_N_D
代わりに場所を表示してください。H_E_A_D
stringは4つの文字列のうち最後の文字列を置き換えます\xfa
。E_N_D
文字列は4つの連続した文字列のうち最初の文字列を置き換えます\xff
。また、行番号でバイトオフセットを同期状態に保つ必要があります。
このように:
PIPELINE | grep -C8n _
出力:
(軽く整えてください)
72596-\x8b 72597-\xfa 72598-\xfa 72599-\xfa 72600:H_E_A_D 72601-\x58 - 72660-\x00 72661:E_N_D 72662-\xff 72663-\xff 72664-\xff 72665-\x72
したがって、上記のコマンドの出力を次のようにパイプできます。
fold ... | sed ... | grep -n _
...ヘッダーが開始および終了できるオフセットのリストを取得します。 GNUの場合、fterスイッチをgrep
使用して、-A
コンテキストシーケンスで見たいバイト数を知らせることができます。たとえば-A777
。次の出力を取得して渡すことができます。
... | grep -A777 E_N_D | sed -ne's/\\/&&/p' | xargs printf %b
...各シーケンスに対して各バイナリバイトを再生し、一致番号はで指定できます-m[num]
。