我现在真的很绝望
无论我怎么努力,搜索和制作不同的剧本,我仍然无法按照我需要的方式修改它
这很简单,
我想读取文件的第一个字节,比如二进制文件00 00 00 10
,补充它,使它成为11 11 11 01
,然后把它写在它的位置,所以如果文件是两个字节,例如,它会是这样的:
00 00 00 10 #First byte
01 10 10 10 #Second byte
修改后将是:
11 11 11 01 #Complement of the first byte
01 10 10 10 #Second byte remains intact
如果有人能解释我的问题,我们将非常感激。
答案 0 :(得分:2)
听起来你想要的是读取追加模式。
with open('file', 'r+b') as file:
data = f.read(1)[0]
data = (~data) % 256
file.seek(0)
file.write(bytes((data,)))
开场模式为r+b
。读取r
,+
表示也启用写入,b
表示二进制,因此读取的结果是字节对象而不是字符串。
f.read(1)[0]
读取文件的第一个字节,并将结果字节对象中的值作为整数提取(字节对象的索引值为整数)
~data
是返回字节的否定。由于python没有真正的字节类型,我们使用% 256
将结果包装回0-255范围。
file.seek(0)
返回文件的开头,以便下一次写入替换第一个字节。 Seek采用字节偏移量。
最后只需将数据写回文件即可。 bytes
在0-255范围内采用一系列整数,因此我们将其赋予元组(data,)
。或者,我们可以使用整数的to_bytes
方法并跳过这样的包装:
with open('file', 'r+b') as file:
data = f.read(1)[0]
data = ~data
file.seek(0)
file.write(data.to_bytes(1, 'little', signed=True))
Read返回一个bytes
对象,该对象是一个字节数组。当您访问一个时,它会将每个索引处的值作为整数返回。要将字节数组转换为单个整数,可以使用int.from_bytes
。它的参数是bytes对象,表示字节序的字符串'big'
或'little'
,以及可选的关键字参数signed
,它告诉我们是否将字节解释为有符号。要转换回来,你可以使用.to_bytes
这是int
对象上的一个方法,该方法有三个参数:要转换的字节数,加上字节序以及是否解释签名数据。
因此,要一次处理多个字节,您可以read
不同的字节数。
在读取或写入之前,您可以随时seek
到文件中的任何字节偏移量。在尝试搜索或读取之前,您还可以使用file.tell()
查找文件中有多少字节。