dop*_*ane 13 linux bash binary-files xxd
我有一个instructions.txt包含以下内容的文件:
00000000000000000000000000010011
00000010110100010010000010000011
00000000011100110000001010110011
00000000011100110000010000110011
00000000011100110110010010110011
00000000000000000000000000010011
Run Code Online (Sandbox Code Playgroud)
如何创建instructions.bin与instructions.txt. 换句话说,.bin文件应该与文件中的 192 位相同.txt,每行 32 位。我在 Ubuntu Linux 上使用 bash。我试图使用,xxd -b instructions.txt但输出比 192 位长得多。
添加-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)
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)