我有一个包含10位整数流的二进制文件。我想阅读并将值存储在列表中。
它与以下代码一起使用,该代码读取my_file
并填充pixels
整数值:
file = open("my_file", "rb")
pixels = []
new10bitsByte = ""
try:
byte = file.read(1)
while byte:
bits = bin(ord(byte))[2:].rjust(8, '0')
for bit in reversed(bits):
new10bitsByte += bit
if len(new10bitsByte) == 10:
pixels.append(int(new10bitsByte[::-1], 2))
new10bitsByte = ""
byte = file.read(1)
finally:
file.close()
将字节读为位,然后将其读回为“ 10位”字节似乎不太好。有更好的方法吗?
使用8或16位整数,我可以直接使用file.read(size)
并将结果转换为int。但是在这里,由于每个值都存储在1.25个字节中,因此我需要类似file.read(1.25)
...
这是一个不使用文本字符串转换就执行位操作的生成器。希望它会更有效率。:)
为了对其进行测试,我将range(1024)中的所有数字都写入了BytesIO流,其行为类似于二进制文件。
from io import BytesIO
def tenbitread(f):
''' Generate 10 bit (unsigned) integers from a binary file '''
while True:
b = f.read(5)
if len(b) == 0:
break
n = int.from_bytes(b, 'big')
#Split n into 4 10 bit integers
t = []
for i in range(4):
t.append(n & 0x3ff)
n >>= 10
yield from reversed(t)
# Make some test data: all the integers in range(1024),
# and save it to a byte stream
buff = BytesIO()
maxi = 1024
n = 0
for i in range(maxi):
n = (n << 10) | i
#Convert the 40 bit integer to 5 bytes & write them
if i % 4 == 3:
buff.write(n.to_bytes(5, 'big'))
n = 0
# Rewind the stream so we can read from it
buff.seek(0)
# Read the data in 10 bit chunks
a = list(tenbitread(buff))
# Check it
print(a == list(range(maxi)))
输出
True
这样做list(tenbitread(buff))
是将生成器输出转换为列表的最简单方法,但是您可以轻松地遍历值,例如
for v in tenbitread(buff):
或者
for i, v in enumerate(tenbitread(buff)):
如果需要索引以及数据值。
这是生成器的小端版本,其结果与您的代码相同。
def tenbitread(f):
''' Generate 10 bit (unsigned) integers from a binary file '''
while True:
b = f.read(5)
if not len(b):
break
n = int.from_bytes(b, 'little')
#Split n into 4 10 bit integers
for i in range(4):
yield n & 0x3ff
n >>= 10
我们可以通过“展开” for循环来稍微改进此版本,这使我们摆脱了最终的遮罩和移位操作。
def tenbitread(f):
''' Generate 10 bit (unsigned) integers from a binary file '''
while True:
b = f.read(5)
if not len(b):
break
n = int.from_bytes(b, 'little')
#Split n into 4 10 bit integers
yield n & 0x3ff
n >>= 10
yield n & 0x3ff
n >>= 10
yield n & 0x3ff
n >>= 10
yield n
这应该给更多的速度...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句