读写动态大小问题的二进制数据

时间:2010-12-13 17:44:39

标签: python binaryfiles

我试图以二进制模式从文件中读取数据并操纵该数据。

 try:
  resultfile = open("binfile", "rb")
 except:
  print "Error"
 resultsize = os.path.getsize("binfile")

有一个32字节的头,我解析得很好,然后二进制数据的缓冲区开始。数据可以是16到4092的任何大小,可以是从文本到pdf或图像或任何其他格式的任何格式。标题具有数据的大小,以便获取此信息

contents = resultfile.read(resultsize)

这会将整个文件放入字符串缓冲区。我发现这可能是我的问题,因为当我尝试将十六进制数据的块从“内容”复制到一个新文件时,某些字节不能正确复制,因此pdfs和图像将会被破坏。

在解释器中打印出一些文件字符串缓冲区会产生类似“%PDF-1.5 \ r \ n%\ xb5 \ xb5 \ xb5 \ xb5 \ r \ n \ n 0 0 obj \ r \ n”的内容我只想要字节本身,以便将它们写入新文件。我错过了这个问题的简单解决方案吗?

这是一个十六进制转储的示例,其中pdf是用我的python和真实的pdf编写的:

25 50 44 46 2D 31 2E 35 0D 0D 0A 25 B5 B5 B5 B5 0D 0D 0A 31 20 30 20 6F 62 6A 0D 0D 0A

25 50 44 46 2D 31 2E 35 0D    0A 25 B5 B5 B5 B5 0D    0A 31 20 30 20 6F 62 6A

每当有0D 0A时,似乎都会添加0D。在图像文件中,它可能是一个不同的字节,我不记得,可能必须测试它。 我编写新文件的代码非常简单,使用内容作为保存所有数据的字符串缓冲区。

        fbuf = contents[offset+8:size+offset]
        fl = open(fname, 'a')
        fl.write(fbuf)

这是基于标题中的签名在循环中调用的。 Offset + 8是实际pdf数据的开头,size是要复制的chunk的大小。

2 个答案:

答案 0 :(得分:2)

您需要以二进制模式打开输出文件,就像输入文件一样。否则,换行符可能会更改。您可以看到这是十六进制转储中发生的情况:0A字符('\n')已更改为OD 0A'\r\n')。

这应该有效:

input_file = open('f1', 'rb')
contents = input_file.read()

#....
data = contents[offset+8:size+offset] #for example

output_file = open('f2', 'wb')
output_file.write(data)

答案 1 :(得分:0)

你得到的结果是“只是字节本身”。您可以将()写入打开的文件进行复制。

“每当有0D 0A时,似乎都会添加0D”

听起来像是在Windows上,并且您正在以文本模式而不是二进制文件打开其中一个文件。