如何在Python 2.x中读写二进制16位数据?

8 投票
5 回答
19012 浏览
提问于 2025-04-16 12:00

我需要读取和写入二进制数据,每个数据元素的特点是:

  • 大小 = 2 字节(16 位)
  • 编码 = 有符号的二进制补码
  • 字节序 = 大端或小端(必须可以选择)

有没有可能不使用任何外部模块?如果可以的话,

  1. 如何使用 read() 从一个二进制文件中读取这样的数据到一个整数数组 L 中?
  2. 如何使用 write() 将整数数组 L 写入一个二进制文件?

5 个回答

1

可以考虑使用

struct.unpack(byteorder + str(len(rawbytes) // 2) + "h", rawbytes)

这里的 byteorder 可以是 '<''>',具体看你的需求,打包的时候也是一样的。注意:我并不是说这个方法比 array 的方法更快,但我注意到 array 的方法有时候需要额外的 byteswap 步骤。

2

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,尤其是当我们刚开始学习编程的时候。为了帮助大家更好地理解这些问题,下面的内容会用简单的语言来解释。

首先,很多时候我们需要知道如何正确地使用某个功能或者命令。有些功能可能有很多选项和参数,这些参数的设置可能会影响到程序的运行结果。如果我们不清楚这些参数的作用,就很容易出错。

其次,调试是编程中非常重要的一部分。当我们的程序出现错误时,我们需要找到问题所在并进行修复。这个过程可能会让人感到沮丧,但只要我们耐心一点,逐步分析,就能找到解决办法。

最后,记得多去查阅资料和文档。很多时候,官方文档会提供详细的说明和示例,帮助我们更好地理解如何使用某个功能。通过不断学习和实践,我们会逐渐变得更加熟练。

总之,编程是一项需要不断学习和实践的技能,遇到问题时不要气馁,慢慢来,总会找到解决的方法。

from array import array
# Edit:
from sys import byteorder as system_endian # thanks, Sven!
# Sigh...
from os import stat

def read_file(filename, endian):
    count = stat(filename).st_size / 2
    with file(filename, 'rb') as f:
        result = array('h')
        result.fromfile(f, count)
        if endian != system_endian: result.byteswap()
        return result
12

我觉得你最好使用array模块。这个模块默认会按照系统的字节顺序来存储数据,不过你可以用array.byteswap()来在不同的字节顺序之间转换。你还可以用sys.byteorder来查询系统的字节顺序。举个例子:

# Create an array of 16-bit signed integers
a = array.array("h", range(10))
# Write to file in big endian order
if sys.byteorder == "little":
    a.byteswap()
with open("data", "wb") as f:
    a.tofile(f)
# Read from file again
b = array.array("h")
with open("data", "rb") as f:
    b.fromfile(f, 10)
if sys.byteorder == "little":
    b.byteswap()

撰写回答