C
如何將二進製文件轉儲為 C/C++ 字元串文字?
我有一個二進製文件,我想包含在我的 C 原始碼中(暫時,出於測試目的),所以我想將文件內容作為 C 字元串獲取,如下所示:
\x01\x02\x03\x04
這可能嗎,也許是通過使用
od
orhexdump
實用程序?雖然不是必需的,但如果字元串可以每 16 個輸入字節換行到下一行,並且在每行的開頭和結尾包含雙引號,那就更好了!我知道字元串將嵌入空值 (
\x00
),因此我需要在程式碼中指定字元串的長度,以防止這些字節提前終止字元串。
你幾乎可以做你想做的事
hexdump
,但我不知道如何在格式字元串中獲取引號和單反斜杠。所以我用sed
. 作為獎勵,我還將每行縮進 4 個空格。:)hexdump -e '16/1 "_x%02X" "\n"' filename | sed 's/_/\\/g; s/.*/ "&"/'
編輯
正如 Cengiz Can 所指出的,上述命令行不能很好地處理短數據行。所以這是一個新的改進版本:
hexdump -e '16/1 "_x%02X" "\n"' filename | sed 's/_/\\/g; s/\\x //g; s/.*/ "&"/'
正如 Malvineous 在評論中提到的那樣,我們還需要傳遞
-v
verbose 選項hexdump
以防止它將相同字節的長執行縮寫為*
.hexdump -v -e '16/1 "_x%02X" "\n"' filename | sed 's/_/\\/g; s/\\x //g; s/.*/ "&"/'
xxd
有一個模式。-i
/--include
選項將:C 包含文件樣式的輸出。寫入完整的靜態數組定義(以輸入文件命名),除非 xxd 從標準輸入讀取。
您可以將其轉儲到一個文件中作為
#include
d,然後foo
像任何其他字元數組一樣訪問(或連結它)。它還包括數組長度的聲明。輸出被包裝成 80 個字節,看起來基本上就像您可能手寫的內容:
$ xxd --include foo unsigned char foo[] = { 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21, 0x0a, 0x0a, 0x59, 0x6f, 0x75, 0x27, 0x72, 0x65, 0x20, 0x76, 0x65, 0x72, 0x79, 0x20, 0x63, 0x75, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x21, 0x20, 0x57, 0x65, 0x6c, 0x6c, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x2e, 0x0a }; unsigned int foo_len = 47;
xxd
有點奇怪,它是vim
分佈的一部分,所以你可能已經有了它。vim
如果沒有,這就是你得到它的地方——你也可以從原始碼中自行建構該工具。