在Python中从二进制文件中读取整数
我正在尝试用 Python 读取 BMP 文件。 我知道前两个字节 表示 BMP 公司。 接下来的 4 个字节是文件大小。 当我执行:
fin = open("hi.bmp", "rb")
firm = fin.read(2)
file_size = int(fin.read(4))
我得到:
ValueError:以 10 为基数的 int() 的文字无效:'F#\x13'
我想要做的是将这四个字节作为整数读取,但Python似乎将它们作为字符读取并返回一个字符串,该字符串无法转换为一个整数。 我怎样才能正确地做到这一点?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
read
方法以字符串形式返回字节序列。 要将字符串字节序列转换为二进制数据,请使用内置的 struct 模块: http://docs.python.org/library/struct.html。请注意,
unpack
始终返回一个元组,因此struct.unpack('i', fin.read(4))[0]
给出您要查找的整数值。您可能应该使用格式字符串
' (< 是一个修饰符,指示小端字节顺序和标准大小和对齐方式 - 默认是使用平台的字节顺序、大小和对齐)。 根据 BMP 格式规范,字节应按 Intel/little-endian 字节顺序写入。
The
read
method returns a sequence of bytes as a string. To convert from a string byte-sequence to binary data, use the built-instruct
module: http://docs.python.org/library/struct.html.Note that
unpack
always returns a tuple, sostruct.unpack('i', fin.read(4))[0]
gives the integer value that you are after.You should probably use the format string
'<i'
(< is a modifier that indicates little-endian byte-order and standard size and alignment - the default is to use the platform's byte ordering, size and alignment). According to the BMP format spec, the bytes should be written in Intel/little-endian byte order.另一种不使用“struct.unpack()”的替代方法是使用 NumPy:
“dtype”代表数据类型,可以是 int#、uint#、float#、complex# 或用户定义的类型。 请参阅
numpy.fromfile
。个人更喜欢使用 NumPy 处理数组/矩阵数据,因为它比使用 Python 列表快得多。
An alternative method which does not make use of 'struct.unpack()' would be to use NumPy:
'dtype' represents the datatype and can be int#, uint#, float#, complex# or a user defined type. See
numpy.fromfile
.Personally prefer using NumPy to work with array/matrix data as it is a lot faster than using Python lists.
从 Python 3.2+ 开始,您还可以使用
from_bytes 来完成此操作
native int 方法:请注意,此函数要求您指定数字是以大端还是小端格式编码,因此您必须确定端序以确保其正常工作。
As of Python 3.2+, you can also accomplish this using the
from_bytes
native int method:Note that this function requires you to specify whether the number is encoded in big- or little-endian format, so you will have to determine the endian-ness to make sure it works correctly.
除了
struct
之外,您还可以使用array
模块Except
struct
you can also usearray
module当您读取二进制文件时,需要将其解压缩为整数,因此请使用 struct module
As you are reading the binary file, you need to unpack it into a integer, so use struct module for that
当您读取二进制文件时,将使用称为字节的数据类型。 这有点像列表或元组,只不过它只能存储 0 到 255 之间的整数。
尝试:
或者:
而不是:
When you read from a binary file, a data type called bytes is used. This is a bit like list or tuple, except it can only store integers from 0 to 255.
Try:
Or:
Instead of:
这是一个迟到的解决方案,但我认为它可能会有所帮助。
Here's a late solution but I though it might help.