C

如何將二進製文件轉儲為 C/C++ 字元串文字?

  • January 23, 2019

我有一個二進製文件,我想包含在我的 C 原始碼中(暫時,出於測試目的),所以我想將文件內容作為 C 字元串獲取,如下所示:

\x01\x02\x03\x04

這可能嗎,也許是通過使用odorhexdump實用程序?雖然不是必需的,但如果字元串可以每 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 在評論中提到的那樣,我們還需要傳遞-vverbose 選項hexdump以防止它將相同字節的長執行縮寫為*.

hexdump -v -e '16/1 "_x%02X" "\n"' filename | sed 's/_/\\/g; s/\\x  //g; s/.*/    "&"/'

xxd有一個模式。-i/--include選項將:

C 包含文件樣式的輸出。寫入完整的靜態數組定義(以輸入文件命名),除非 xxd 從標準輸入讀取。

您可以將其轉儲到一個文件中作為#included,然後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如果沒有,這就是你得到它的地方——你也可以從原始碼中自行建構該工具。

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