1

我想读取二进制文件(如 .bmp 或 .jpg)并将每个二进制数据转换为 ascii 并进行乘法(如 ascii * 2)并转换回二进制格式并写入新文件。

我写的程序如下

    filename = input("enter file to read: ")
    readfile = filename + ".bmp"
    writefilebmp = filename + '1' + ".bmp"
    fr = open(readfile,"rb");
    fwbmp = open(writefilebmp,"wb");
    bytes_read = fr.read(1024)
    for b in bytes_read:
        print(b,end='')
        data = b*2;
        fwbmp.write(data)
    fr.close()
    fwbmp.close()

但我收到以下错误

TypeError: 'int' 不支持缓冲区接口

注意:一旦我解决了,我将修改代码以跳过 bmp 或 jpeg 标头

修改的

    filename = input("enter file to read: ")
    readfile = filename + ".bmp"
    writefilebmp = filename + '1' + ".bmp"
    fr = open(readfile,"rb");
    fwbmp = open(writefilebmp,"wb");
    bytes_read = fr.read(20)
    for b in bytes_read:
        print(b,end='')
        data = b*2;
        fwbmp.write(bytes(data))
    fr.close()
    fwbmp.close()
4

1 回答 1

2

您正在循环字节,这会为您提供整数。转换回字节以写入二进制文件:

fwbmp.write(bytes([data % 256]))

这里需要模 256 以将结果 int 值限制为允许值。您还可以使用以下命令将值上限为 255 min()

fwbmp.write(bytes([min(data, 255)]))

或者,如果加倍导致溢出,则可以写入两个字节:

if data > 255:
    fwbmp.write(bytes(divmod(data, 256)))
else:
    fwbmp.write(bytes([data]))

或者总是产生 2 个字节,无论第一个字节是0x01or 0x00

fwbmp.write(bytes(divmod(data, 256)))

您需要确定您希望“加倍”在输出方面的含义。

于 2013-10-23T11:11:02.497 回答