この質問はしばらく前からありましたが、それを機能させることができれば、いくつかのボーナスポイントを提供する必要があると思いました.
私は何をしましたか…</h1>
最近、職場で、バイナリ ファイルを読み取り可能な形式に変換するパーサーを作成しました。バイナリ ファイルは、10101010
文字を含む ASCII ファイルではありません。バイナリでエンコードされています。したがってcat
、ファイルに対して a を実行すると、次のようになります-
[jaypal~/Temp/GTP]$ cat T20111017153052.NEW
==?sGTP?ղ?N????W????&Xx1?T?&Xx1?;
?d@#e?
?0H????????|?X?@@(?ղ??VtPOC01
cceE??k@9??W傇??R?K?i2??d@#e???&Xx1&Xx??!?
blackberrynet?/??!
??!
??#ripassword??W傅?W傆??0H??
#R??@Vtc@@(?ղ??n?POC01
そこでhexdump
、ユーティリティを使用してコンテンツに続いてファイルを表示し、ファイルにリダイレクトしました。これで、16 進値を含むテキスト ファイルである出力ファイルができました。
[jaypal~/Temp/GTP]$ hexdump -C T20111017153052.NEW
00000000 3d 3d 01 f8 73 47 54 50 02 f1 d5 b2 be 4e e4 d7 |==..sGTP.....N..|
00000010 00 01 01 00 01 80 00 cc 57 e5 82 00 00 00 00 00 |........W.......|
00000020 00 00 00 00 00 00 00 00 87 d3 f5 13 00 00 00 00 |................|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 10 |................|
00000040 01 01 0f 00 00 00 00 00 26 58 78 31 00 b3 54 c5 |........&Xx1..T.|
00000050 26 58 78 31 00 b4 3b 0a 00 00 ad 64 13 40 01 03 |&Xx1..;....d.@..|
00000060 23 16 65 f3 01 01 0b 91 30 19 48 99 f2 ff ff ff |#.e.....0.H.....|
00000070 ff ff ff 02 00 7c 00 dc 01 58 00 a0 40 40 28 02 |.....|...X..@@(.|
00000080 f1 d5 b2 b8 ca 56 74 50 4f 43 30 31 00 00 00 00 |.....VtPOC01....|
00000090 00 04 0a 63 63 07 00 00 00 00 00 00 00 00 00 00 |...cc...........|
000000a0 00 00 00 65 45 00 00 b4 fb 6b 40 00 39 11 16 cd |...eE....k@.9...|
000000b0 cc 57 e5 82 87 d3 f5 52 85 a1 08 4b 00 a0 69 02 |.W.....R...K..i.|
000000c0 32 10 00 90 00 00 00 00 ad 64 00 00 02 13 40 01 |2........d....@.|
大量のawk
、sed
およびのcut
後、スクリプトは 16 進値を読み取り可能なテキストに変換しました。そのために、変換された各パラメータの開始位置と終了位置をマークするオフセット位置を使用しました。すべての変換後の結果ファイルは次のようになります
[jaypal:~/Temp/GTP] cat textfile.txt
Beginning of DB Package Identifier: ==
Total Package Length: 508
Offset to Data Record Count field: 115
Data Source: GTP
Timestamp: 2011-10-25
Matching Site Processor ID: 1
DB Package format version: 1
DB Package Resolution Type: 0
DB Package Resolution Value: 1
DB Package Resolution Cause Value: 128
Transport Protocol: 0
SGSN IP Address: 220.206.129.47
GGSN IP Address: 202.4.210.51
なぜ私はそれをしたのですか
私はテスト エンジニアであり、バイナリ ファイルを手動で検証することは大きな苦痛でした。手動でオフセットを解析し、電卓を使用してそれらを変換し、Wireshark と GUI に対して検証する必要がありました。
さて質問部分
今までと逆のことをしたい。これが私の計画だった -
- 読みやすい入力テキスト ファイルを用意します
Parameters : Values
。 - ユーザーは単純にそれらの横に値を入力できます (たとえば、日付はパラメーターであり、ユーザーはデータ ファイルに含める日付を指定できます)。
- スクリプトは、入力テキスト ファイルからすべての関連情報 (ユーザーが提供した情報) を切り取り、それらを 16 進数値に変換します。
- ファイルが 16 進値に変換されたら、それをバイナリにエンコードしたいと思います。
最初の 3 つのステップが完了しました
問題
スクリプトが入力テキスト ファイルを 16 進数値のテキスト ファイルに変換すると、次のようなファイルが得られます (これで実行できることに注意cat
してください)。
[visdba@hw-diam-test01 ParserDump]$ cat temp_file | sed 's/.\{32\}/&\n/g' | sed 's/../& /g'
3d 3d 01 fc 73 47 54 50 02 f1 d6 55 3c 9f 49 9c
00 01 01 00 01 80 00 dc ce 81 2f 00 00 00 00 00
00 00 00 00 00 00 00 00 ca 04 d2 33 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10
01 01 0f 00 00 07 04 ea 00 00 ff ff 00 00 14 b7
00 00 ff ff 00 00 83 ec 00 00 83 62 54 14 59 00
60 38 34 f5 01 01 0b 58 62 70 11 60 f6 ff ff ff
ff ff ff 02 00 7c 00 d0 01 4c 00 b0 40 40 28 02
f1 d6 55 38 cb 2b 23 50 4f 43 30 31 00 00 00 00
00 04 0a 63 63 07 00 00 00 00 00 00 00 00 00 00
私の意図は、この変換されたファイルをバイナリにエンコードして、ファイルを処理すると大量のガベージ値が得られるようにすることです。cat
[jaypal~/Temp/GTP]$ cat temp.file
==?sGTP?ղ?N????W????&Xx1?T?&Xx1?;
?d@#e?
?0H????????|?X?@@(?ղ??VtPOC01
cceE??k@9??W傇??R?K?i2??d@#e???&Xx1&Xx??!?
blackberrynet?/??!
??!
質問はこれです。この形式でエンコードするにはどうすればよいですか?
なぜ私はこれをしたいのですか?
本番環境では、多くの GTP (GPRS Tunneling Protocol) メッセージはありません。これをリバースエンジニアリングすれば、効果的にデータジェネレーターを作成し、独自のデータを作成できると思いました。
まとめて
世の中には洗練されたツールがあるかもしれませんが、私はそれらの学習にあまり時間をかけたくありません。約 2 か月が経ちました。*nix プラットフォームの作業を開始し、 や などのパワー ツールを使い始めましsed
たawk
。
私が欲しいのは、これを実現するための助けとガイダンスです。
読んでくれてありがとう!正しい方向に私を導くことができる誰かを 200 ポイントが待っています。:)
サンプルファイル
元のバイナリ ファイルのサンプルを次に示します。
ユーザーが値を入力できる入力テキスト ファイルのサンプルを次に示します。
以下は、入力テキスト ファイルからのすべての変換が完了した後にスクリプトが作成するファイルのサンプルです。
File 3
のエンコーディングをに変更するにはどうすればよいFile 1
ですか?