#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

おすすめ記事