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