代码之家  ›  专栏  ›  技术社区  ›  Sam

如何在python中修改文件的二进制状态?

  •  1
  • Sam  · 技术社区  · 9 年前

    我现在真的很绝望。
    无论我如何努力,搜索和制作不同的脚本,我仍然无法按需要的方式修改它。
    很简单, 我想读取文件的第一个字节,比如二进制 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
    

    如果有人能解释一下我的问题,我将不胜感激。

    1 回复  |  直到 9 年前
        1
  •  2
  •   zstewart    9 年前

    听起来你想要的是读附加模式。

    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) 返回到文件的开头,以便下一次写入替换第一个字节。查找以字节为单位的偏移量。

    最后,只需将数据写回文件。 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))
    

    读取返回a 字节 对象,它是一个字节数组。当您访问一个时,它会将每个索引处的值作为整数返回。要将字节数组转换为单个整数,可以使用 int.from_bytes 。它的参数是字节对象,一个字符串 'big' 'little' 指示尾数和可选关键字参数 signed 它告诉是否将字节解释为有符号的。要转换回,可以使用 .to_bytes 这是一个 int 对象,它接受三个参数:要转换为的字节数,加上字节数和是否解释签名数据。

    因此,要一次处理多个字节,您可以 read 不同的字节数。

    你可以 seek 在读取或写入之前的任何时间,将文件中的任何字节偏移量。您也可以使用 file.tell() 在尝试查找或读取之前,找出文件中有多少字节。