#1

#1

xxd -ps16進形式で見ているバイナリデータがあります。区切り記号付きの2つのヘッダー間のバイト距離は48300(= 805 * 60)バイトですfafafafa。ファイルの先頭をスキップする必要があります。

fafafafaヘッダーの間に48300バイトの16進データの例を取得できます。ここと言うデータ2015.6.26.txtこれらのヘッダーの3つとほぼ同等のバイナリここと言うtest_27.6.2015.bin最初の2つのヘッダーしかありません。どちらのファイルでも、最後のヘッダーのデータは全長ではありません。そうでなければ、バイトオフセット、すなわちヘッダ間のデータ長が固定されていると仮定することができる。

アルゴリズム擬似コード

  1. タイトルの終わりを確認してください。
  2. 最初の2つのタイトル位置を見て、その位置の違いを設定します(d2-d1)イベント間の距離は固定されています(777)。
  3. バイト位置別にデータを分割する(777) - TODOバイナリ形式に分割する必要がありますか、またはxxd -ps変換されたデータを分割する必要がありますか?バイト位置別(777)

xxd -r同様の方法でデータをバイナリに変換できますが、xxd -ps | split and store | xxd -rこれが必要かどうかはまだわかりません。

どの段階でバイナリデータを分割できますか?xxd -ps変換された形式またはバイナリデータのみが使用されます。

変換された形式に分割する場合、xxd -psforループがファイルを繰り返す唯一の方法だと思います。可能な分割ツールcsplitsplit...、わからない。しかし、わかりません。

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_Dstringは4つの文字列のうち最後の文字列を置き換えます\xfaE_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]

関連情報