將文字檔案轉換為二進位文件

將文字檔案轉換為二進位文件

instructions.txt我有一個包含內容的文件:

00000000000000000000000000010011
00000010110100010010000010000011
00000000011100110000001010110011
00000000011100110000010000110011
00000000011100110110010010110011
00000000000000000000000000010011

如何創建instructions.bininstructions.txt.換句話說,該.bin文件應與文件中的內容相同,.txt均為 192 位,每行 32 位。我在 Ubuntu Linux 上使用 bash。我試圖使用,xxd -b instructions.txt但輸出比 192 位元長得多。

答案1

oneliner 將 32 位元 1 和 0 字串轉換為對應的二進位:

$ perl -ne 'print pack("B32", $_)' < instructions.txt > instructions.bin

它能做什麼:

  • perl -ne將迭代 STDIN ( instructions.txt)上提供的輸入檔的每一行
  • pack("B32", $_)將取得 32 位元的字串清單($_我們剛剛從 STDIN 讀取),並將其轉換為二進位值("b32"如果您想要每個位元組內的升序位元順序而不是降序位元順序,您也可以使用它;請參閱參考資料perldoc -f pack以取得更多詳細資訊)
  • print然後將轉換後的值輸出到 STDOUT,然後我們將其重定向到二進位文件instructions.bin

核實:

$ hexdump -Cv instructions.bin
00000000  00 00 00 13 02 d1 20 83  00 73 02 b3 00 73 04 33  |...... ..s...s.3|
00000010  00 73 64 b3 00 00 00 13                           |.sd.....|
00000018

$ xxd -b -c4 instructions.bin
00000000: 00000000 00000000 00000000 00010011  ....
00000004: 00000010 11010001 00100000 10000011  .. .
00000008: 00000000 01110011 00000010 10110011  .s..
0000000c: 00000000 01110011 00000100 00110011  .s.3
00000010: 00000000 01110011 01100100 10110011  .sd.
00000014: 00000000 00000000 00000000 00010011  ....

答案2

添加-r選項(反向模式)實際上並xxd -b沒有按預期工作,因為 xxd 根本不支援組合這兩個標誌(-b如果兩者都給出,它會忽略)。相反,您必須先自己將這些位元轉換為十六進位。例如這樣:

( echo 'obase=16;ibase=2'; sed -Ee 's/[01]{4}/;\0/g' instructions.txt ) | bc | xxd -r -p > instructions.bin

完整解釋:

  • 括號內的部分建立一個bc腳本。它首先將輸入基數設定為二進位 (2),將輸出基數設定為十六進位 (16)。之後,sed指令列印內容,instructions.txt每組 4 位元之間以分號隔開,對應 1 個十六進位數字。結果透過管道傳輸到bc.
  • 分號是 中的命令分隔符bc,因此腳本所做的就是列印每個輸入整數(基數轉換後)。
  • 的輸出bc是一系列十六進制數字,可以將其轉換為通常的xxd -r -p.

輸出:

$ hexdump -Cv instructions.bin
00000000  00 00 00 13 02 d1 20 83  00 73 02 b3 00 73 04 33  |...... ..s...s.3|
00000010  00 73 64 b3 00 00 00 13                           |.sd.....|
00000018
$ xxd -b -c4 instructions.bin
00000000: 00000000 00000000 00000000 00010011  ....
00000004: 00000010 11010001 00100000 10000011  .. .
00000008: 00000000 01110011 00000010 10110011  .s..
0000000c: 00000000 01110011 00000100 00110011  .s.3
00000010: 00000000 01110011 01100100 10110011  .sd.
00000014: 00000000 00000000 00000000 00010011  ....

答案3

我的原答案不正確 -xxd不能接受-p-r-b...

鑑於其他答案是可行的,並且符合“其他方式”,下面的怎麼樣:

輸入

$ cat instructions.txt
00000000000000000000000000010011
00000010110100010010000010000011
00000000011100110000001010110011
00000000011100110000010000110011
00000000011100110110010010110011
00000000000000000000000000010011

輸出

$ hexdump -Cv < instructions.bin
00000000  00 00 00 13 02 d1 20 83  00 73 02 b3 00 73 04 33  |...... ..s...s.3|
00000010  00 73 64 b3 00 00 00 13                           |.sd.....|
00000018

bash 管道:

cat instructions.txt \
    | tr -d $'\n' \
    | while read -N 4 nibble; do 
        printf '%x' "$((2#${nibble}))"; \
      done \
    | xxd -r -p \
    > instructions.bin
  • cat- 不必要,但為了清晰起見使用
  • tr -d $'\n'- 從輸入中刪除所有換行符
  • read -N 4 nibble- 讀確切地nibble變數中包含 4× 個字符
  • printf '%x' "$((2#${nibble}))"將半位元組從二進位轉換為 1× 十六進位字符
    • $((2#...))- 將給定值從基數 2(二進位)轉換為基數 10(十進位)
    • printf '%x'- 將給定值從 10 進位(十進位)格式化為 16 進位(十六進位)
  • xxd -r -p- 反轉 ( -r) 普通轉儲 ( -p) - 從十六進位到原始二進位

Python:

python << EOF > instructions.bin
d = '$(cat instructions.txt | tr -d $'\n')'
print(''.join([chr(int(d[i:i+8],2)) for i in range(0, len(d), 8)]))
EOF
  • 未引用的特雷多克( << EOF) 用於將內容取得到Python程式碼中
    • 如果輸入變大,這效率不高
  • cattr- 用於獲取乾淨的(單行)輸入
  • range(0, len(d), 8)- 取得從 0 到字串末尾的數字列表d,一次步進 8× 個字元。
  • chr(int(d[i:i+8],2))- 將目前切片 ( d[i:i+8]) 從二進位轉換為十進位 ( int(..., 2)),然後轉換為原始字元 ( chr(...))
  • [ x for y in z]-列表理解
  • ''.join(...)- 將字元清單轉換為單一字串
  • print(...)- 列印它

答案4

二進位檔案不使用換行符號分隔行。二進位檔案沒有分隔符號;它只是一個帶有一堆 0 和 1 的文件,存儲在某個設備上,排列在由文件分配表或類似映射控制的扇區中以賦予其含義。

您可以將文字檔案按原樣轉換為二進制,產生 192 位元(24 位元組),也可以在每個 32 位元序列後添加換行符,以提供具有 6 個額外位元組的檔案。

根據要求,下面的程式碼為您提供了一個 192 位元檔案:

for x in $(cat file.txt); 
do s=${x:0:32}; 
echo $(printf '%08X' "$((2#$s))"); 
done | xxd -r -p > file.bin

如果不需要額外的填充程式碼(文字檔案中的 4 位元組行),另一種方法是一次讀取 8 位

在 Ubuntu 16.04.7 上測試

相關內容