將帶有地址、字節值和註釋的文本文件解析為二進製文件
我正在嘗試從以下形式的文件開始:
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
並使用它生成一個 8 字節的文件,其值(以十六進制形式)為:
42 52 62 72 00 00 00 1f
確切的輸入格式並不是一成不變的。我剛選了’;’ 作為註釋分隔符,因為它是單個字元且明確。根據傳統,偏移量的形式:和 2 位十六進制值似乎很明顯。
我懷疑最終的解決方案涉及使用
sed
或awk
刪除評論,然後將它們的輸出管道傳輸xxd
到簡單的文本文件。對於我的第一次嘗試,我簡化了 config.src:
00: 42 01: 52 02: 62 03: 72
(暫時省略註釋和隱含的零字節,並堅持對應於可列印 ASCII 的值)
…然後嘗試從中生成二進製文件:
xxd -r config.src config.bin
我期望從
cat config.bin
和看到的xxd config.bin
:
BRbr
和00000000: 42 52 62 72 BRbr
我最終得到了什麼:
cat
無法呈現具有不可列印內容的 2 字節文件,以下輸出來自xxd config.bin
:00000000: 0301
所以……問題#1……我做錯了什麼 xxd,我該如何解決它(或者有更好的方法)?請記住,我真的想為每行指定一個字節值,並且真的希望能夠自動跳過連續值並讓它們自動填充零。
……問題#2……一旦我讓xxd解析我的文件,我怎樣才能在xxd看到它們之前添加註釋並刪除它們?
請注意,我並不熱衷於使用 xxd 本身……但這是一個共享的 Web 伺服器,我沒有 root 或管理員訪問權限,所以
apt-get install
不是一個選項,並且從原始碼編譯我自己的副本不會’不一定很容易)。(背景資訊……不是解決問題所必需的,但為我嘗試這樣做的原因添加了背景資訊)
我正在開發基於 Arduino 的物聯網控制器。在過去的幾周里,它的配置包括硬編碼值和我每隔幾天重新調整用途的 DIP 開關的各種解釋。越來越乏味了 我還沒有心情實現一個合適的 UI,所以我想出了讓它從我的 Web 伺服器獲取二進製配置 blob 到 char 的想法
$$ $$作為它在啟動時的第一個動作(使我能夠調整執行時配置值,而不必一路重新刷新電路板本身,這在這一點上說實話有點痛苦)。
讓我們從你的開始
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 ;