如何在Python 2.x中读写二进制16位数据?
我需要读取和写入二进制数据,每个数据元素的特点是:
- 大小 = 2 字节(16 位)
- 编码 = 有符号的二进制补码
- 字节序 = 大端或小端(必须可以选择)
有没有可能不使用任何外部模块?如果可以的话,
- 如何使用 read() 从一个二进制文件中读取这样的数据到一个整数数组 L 中?
- 如何使用 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()