将位的文本文件转换为二进制文件

dop*_*ane 13 linux bash binary-files xxd

我有一个instructions.txt包含以下内容的文件:

00000000000000000000000000010011
00000010110100010010000010000011
00000000011100110000001010110011
00000000011100110000010000110011
00000000011100110110010010110011
00000000000000000000000000010011
Run Code Online (Sandbox Code Playgroud)

如何创建instructions.bininstructions.txt. 换句话说,.bin文件应该与文件中的 192 位相同.txt,每行 32 位。我在 Ubuntu Linux 上使用 bash。我试图使用,xxd -b instructions.txt但输出比 192 位长得多。

nom*_*ype 8

添加-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
Run Code Online (Sandbox Code Playgroud)

完整解释:

  • 括号内的部分创建一个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  ....
Run Code Online (Sandbox Code Playgroud)


Mat*_*lis 6

oneliner 将 32 位的 1 和 0 字符串转换为相应的二进制:

$ perl -ne 'print pack("B32", $_)' < instructions.txt > instructions.bin
Run Code Online (Sandbox Code Playgroud)

它能做什么:

  • 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  ....
Run Code Online (Sandbox Code Playgroud)