在Python中从二进制文件中读取整数

发布于 2024-07-28 23:35:33 字数 446 浏览 7 评论 0 原文

我正在尝试用 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似乎将它们作为字符读取并返回一个字符串,该字符串无法转换为一个整数。 我怎样才能正确地做到这一点?

I'm trying to read a BMP file in Python. I know the first two bytes
indicate the BMP firm. The next 4 bytes are the file size. When I execute:

fin = open("hi.bmp", "rb")
firm = fin.read(2)  
file_size = int(fin.read(4))  

I get:

ValueError: invalid literal for int() with base 10: 'F#\x13'

What I want to do is reading those four bytes as an integer, but it seems Python is reading them as characters and returning a string, which cannot be converted to an integer. How can I do this correctly?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

静水深流 2024-08-04 23:35:33

read 方法以字符串形式返回字节序列。 要将字符串字节序列转换为二进制数据,请使用内置的 struct 模块: http://docs.python.org/library/struct.html

import struct

print(struct.unpack('i', fin.read(4)))

请注意,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-in struct module: http://docs.python.org/library/struct.html.

import struct

print(struct.unpack('i', fin.read(4)))

Note that unpack always returns a tuple, so struct.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.

好听的两个字的网名 2024-08-04 23:35:33

另一种不使用“struct.unpack()”的替代方法是使用 NumPy

import numpy as np

f = open("file.bin", "r")
a = np.fromfile(f, dtype=np.uint32)

“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:

import numpy as np

f = open("file.bin", "r")
a = np.fromfile(f, dtype=np.uint32)

'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.

故乡的云 2024-08-04 23:35:33

从 Python 3.2+ 开始,您还可以使用 from_bytes 来完成此操作 native int 方法:

file_size = int.from_bytes(fin.read(2), byteorder='big')

请注意,此函数要求您指定数字是以大端还是小端格式编码,因此您必须确定端序以确保其正常工作。

As of Python 3.2+, you can also accomplish this using the from_bytes native int method:

file_size = int.from_bytes(fin.read(2), byteorder='big')

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.

平定天下 2024-08-04 23:35:33

除了 struct 之外,您还可以使用 array 模块

import array
values = array.array('l') # array of long integers
values.read(fin, 1) # read 1 integer
file_size  = values[0]

Except struct you can also use array module

import array
values = array.array('l') # array of long integers
values.read(fin, 1) # read 1 integer
file_size  = values[0]
你在看孤独的风景 2024-08-04 23:35:33

当您读取二进制文件时,需要将其解压缩为整数,因此请使用 struct module

import struct
fin = open("hi.bmp", "rb")
firm = fin.read(2)  
file_size, = struct.unpack("i",fin.read(4))

As you are reading the binary file, you need to unpack it into a integer, so use struct module for that

import struct
fin = open("hi.bmp", "rb")
firm = fin.read(2)  
file_size, = struct.unpack("i",fin.read(4))
手心的温暖 2024-08-04 23:35:33

当您读取二进制文件时,将使用称为字节的数据类型。 这有点像列表或元组,只不过它只能存储 0 到 255 之间的整数。

尝试:

file_size = fin.read(4)
file_size0 = file_size[0]
file_size1 = file_size[1]
file_size2 = file_size[2]
file_size3 = file_size[3]

或者:

file_size = list(fin.read(4))

而不是:

file_size = int(fin.read(4))

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:

file_size = fin.read(4)
file_size0 = file_size[0]
file_size1 = file_size[1]
file_size2 = file_size[2]
file_size3 = file_size[3]

Or:

file_size = list(fin.read(4))

Instead of:

file_size = int(fin.read(4))
会傲 2024-08-04 23:35:33

这是一个迟到的解决方案,但我认为它可能会有所帮助。

fin = open("hi.bmp", "rb")
firm = fin.read(2)
file_size = 0
for _ in range(4):  
    (file_size << 8) += ord(fin.read(1))

Here's a late solution but I though it might help.

fin = open("hi.bmp", "rb")
firm = fin.read(2)
file_size = 0
for _ in range(4):  
    (file_size << 8) += ord(fin.read(1))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文