Xxd

將帶有地址、字節值和註釋的文本文件解析為二進製文件

  • April 27, 2020

我正在嘗試從以下形式的文件開始:

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 位十六進制值似乎很明顯。

我懷疑最終的解決方案涉及使用sedawk刪除評論,然後將它們的輸出管道傳輸xxd到簡單的文本文件。


對於我的第一次嘗試,我簡化了 config.src:

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

(暫時省略註釋和隱含的零字節,並堅持對應於可列印 ASCII 的值)

…然後嘗試從中生成二進製文件:

xxd -r config.src config.bin

我期望從cat config.bin和看到的xxd config.bin

BRbr00000000: 42 52 62 72 BRbr

我最終得到了什麼:

cat無法呈現具有不可列印內容的 2 字節文件,以下輸出來自xxd config.bin00000000: 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 ;

引用自:https://unix.stackexchange.com/questions/582738