如何将特定位推送到新文件中?

如何将特定位推送到新文件中?

有没有什么办法可以将特定的位推送到新文件中,而无需创建临时文件然后将它们连接起来?

例如,我想创建一个 10 个八位字节的文件,其中前三个设置为4,接下来的两个设置为7,最后五个设置为32

0000.0100 0000.0100 0000.0100 0000.0111 0000.0111 0010.0000 0100.0000 0010.0000 0010.0000 0010.0000

我需要一个可以让我创建大文件的解决方案,其中特定的位被重复多次。

答案1

在 ruby​​ 中,编写该模式 10 次:

File.open('bits','w') do |f|
    10.times do
        f << ([0x04]*3+[0x07]*2+[0x20]*5).pack('C*')
    end
end

通过在每次迭代中写入文件,我们只会在内存中保留位模式的单个副本。这样,您可以通过将 更改为 等来写入任意大的10.times文件10000.times

因此从命令行:

$ ruby -e "File.open('bits','w'){|f|10.times{f<<([0x04]*3+[0x07]*2+[0x20]*5).pack('C*')}}"

然后检查文件:

$ xxd -b bits 
0000000: 00000100 00000100 00000100 00000111 00000111 00100000  ..... 
0000006: 00100000 00100000 00100000 00100000 00000100 00000100      ..
000000c: 00000100 00000111 00000111 00100000 00100000 00100000  ...   
0000012: 00100000 00100000 00000100 00000100 00000100 00000111    ....
0000018: 00000111 00100000 00100000 00100000 00100000 00100000  .     
000001e: 00000100 00000100 00000100 00000111 00000111 00100000  ..... 
0000024: 00100000 00100000 00100000 00100000 00000100 00000100      ..
000002a: 00000100 00000111 00000111 00100000 00100000 00100000  ...   
0000030: 00100000 00100000 00000100 00000100 00000100 00000111    ....
0000036: 00000111 00100000 00100000 00100000 00100000 00100000  .     
000003c: 00000100 00000100 00000100 00000111 00000111 00100000  ..... 
0000042: 00100000 00100000 00100000 00100000 00000100 00000100      ..
0000048: 00000100 00000111 00000111 00100000 00100000 00100000  ...   
000004e: 00100000 00100000 00000100 00000100 00000100 00000111    ....
0000054: 00000111 00100000 00100000 00100000 00100000 00100000  .     
000005a: 00000100 00000100 00000100 00000111 00000111 00100000  ..... 
0000060: 00100000 00100000 00100000 00100000                        

请参阅 Array.pack 的文档这里

答案2

在 Python 中这非常简单。你只需输入python以下内容即可启动交互式解释器:

>>> open("test.bin", "wb").write("\4\4\4\7\7\32\32\32\32\32")

'wb'表示“打开文件并向其中写入二进制数据”,仅使用打开文件w将假定您要写入文本對它來說。

注意这些八进制数字(\320x1a,或 26)!它们也可以是十六进制(\xff),您可以通过执行以下操作来节省一些输入:

>>> "\x00" * 4 + "\x09"
'\x00\x00\x00\x00\x09'

应用正常的运算符优先级。

要获取更多数据,您可以使用十进制整数列表 - 我发现它更易于阅读和输入:

>>> d = [1, 2, 3, 4, 5]
>>> ''.join(chr(i) for i in d)
'\x01\x02\x03\x04\x05'

如果您更喜欢使用python3,您可以bytes()像这样使用:

>>> bytes([1, 2, 3, 4, 5])

当然,“算术”的工作原理正如你所期望的那样:

>>> [1, 2, 3] * 2 + [9] * 4 + range(4)
[1, 2, 3, 1, 2, 3, 9, 9, 9, 9, 0, 1, 2, 3]
>>> range(10, 0, -3)
[10, 7, 4, 1]

二进制、口令和十六进制文字的写法如下:

0b1100 == 0o14 == 12 == 0xc

(或者014如果你愿意)

如果您想做一些复杂的事情,请先打开文件,然后逐渐写入:

>>> f = open("test.bin", "wb")
>>> f.write("\xff" * 100)
>>> for i in range(10):
...     f.write("\xff\xfa\x03")
...
>>> f.close()

如果您想编写脚本,您可以使用-c开关直接从命令行调用代码:

python -c "open('test.bin', 'wb').write(''.join(chr(i) for i in [1, 2, 3]))"

相关内容