アドレス、バイト値、およびコメントを含むテキストファイルをバイナリファイルに解析します。

アドレス、バイト値、およびコメントを含むテキストファイルをバイナリファイルに解析します。

次の形式のファイルから始めようとしています。

00: 42 ; byte 0 is 0x42 / d
01: 52 ; byte 1 is 0x52 / r
02: 62 ; byte 2 is 0x62 / D
03: 72 ; byte 3 is 0x72 / R
07: 1f ; bytes 03..0e are implicitly 00, byte 0f is 0x1f

これを使用して、次の値(16進形式)で8バイトのファイルを生成します。

42 52 62 72 00 00 00 1f

正確な入力形式は固定されていません。私は単一文字で明確なので、コメント区切り文字として「;」を選択しました。伝統的に offset: と 2 桁の 16 進値の型が明らかに見えます。

私は究極の解決策がコメントを使用sedまたはawk削除して出力をパイピングすることを含むと思いますxxdが、これまでの最初の実験は失敗し、最良のシナリオである単純なテキストファイルを解析するためにxxdを取得することもできません。


最初の試みでは、config.srcを単純化しました。

00: 42
01: 52
02: 62
03: 72

(今はコメントと暗黙の0バイトを省略し、印刷可能なASCIIに対応する値に固執します)

...その後、バイナリを作成してみてください。

xxd -r config.src config.bin

cat config.bin私はから何を見ると期待していますかxxd config.bin

BRbrそして00000000: 42 52 62 72 BRbr

私が終わるのは次のとおりです。

印刷できないコンテンツを含む2バイトファイルは、cat次の出力にレンダリングできませんxxd config.bin00000000: 0301

だから...質問#1 ...私はxxdに何が間違っていたのですか?、どのように解決できますか(またはより良い方法がありますか?)私は各行にバイト値を割り当て、連続した値を自動的にスキップし、自動的にゼロで埋めることができることに注意してください。

質問#2... xxdが私のファイルを分析した後、コメントを追加し、xxdが表示する前に削除できますか?

xxd自体を使用するつもりはありません...しかし、これは共有ネットワークサーバーであり、rootまたは管理者アクセス権がないため、これはapt-get installオプションではなく、ソースから自分のコピーをコンパイルすることは不可能です。必ずしもそれほど簡単ではありません)。


(背景情報...問題を解決するために必要ではありませんが、これを行う理由を説明するために追加できます)

ArduinoベースのIoTコントローラを開発しています。過去数週間で、その構成はハードコーディングされた値と数日ごとに用途を変更するDIPスイッチのさまざまな解釈で構成されています。どんどん退屈しています。私はまだ適切なUIを実装していないので、起動時に最初のタスクとしてWebサーバーからバイナリ構成BLOBをchar []にインポートする方法を考えました(ランタイム構成値を調整できます)。ボード自体を更新する必要なく、この時点で本当に痛いです。)

ベストアンサー1

あなたのものから始めましょうconfig.src

$ cat config.src
00: 42 ; byte 0 is 0x42 / d
01: 52 ; byte 1 is 0x52 / r
02: 62 ; byte 2 is 0x62 / D
03: 72 ; byte 3 is 0x72 / R
07: 1f ; bytes 03..0e are implicitly 00, byte 0f is 0x1f

これをに変換するとconfig.binコメントがスキップされます-c1

$ xxd -r -c1 config.src config.bin
$ xxd config.bin
00000000: 4252 6272 0000 001f                      BRbr....

次のconfig.src形式に戻ります。

$ xxd -c1 config.bin # this is unmodified
00000000: 42  B
00000001: 52  R
00000002: 62  b
00000003: 72  r
00000004: 00  .
00000005: 00  .
00000006: 00  .
00000007: 1f  .
$ xxd -c1 config.bin | awk -F '' '
  {
    $0=substr($0, 7)    # remove 6 leading characters
    $0=substr($0, 1, 6) # remove ASCII output
  }
  /00$/{ next }      # skip hex 00
  { print $0 " ; " } # print line and empty comment
'
00: 42 ;
01: 52 ;
02: 62 ;
03: 72 ;
07: 1f ;

おすすめ記事