次の形式のファイルから始めようとしています。
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.bin
。00000000: 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 ;