使用python有效地解包单12压缩位字符串格式

使用python有效地解包单12压缩位字符串格式,python,bit-manipulation,byte,bit,nibble,Python,Bit Manipulation,Byte,Bit,Nibble,我有一个相机的原始数据,是单12压缩格式的。这是一种隔行扫描位格式,用于在3字节中存储2个12位整数,以消除开销。明确地说,每3个字节的内存布局如下所示: Byte 1 = Pixel0 Bits 11-4 Byte 2 = Pixel1 Bits 3-0 + Pixel0 Bits 3-0 Byte 3 = Pixel1 Bits 11-4 我有一个文件,所有的字节都可以通过二进制读取来读取,假设它叫做binfile 要从文件中获取像素数据,请执行以下操作: from bitstring i

我有一个相机的原始数据,是单12压缩格式的。这是一种隔行扫描位格式,用于在3字节中存储2个12位整数,以消除开销。明确地说,每3个字节的内存布局如下所示:

Byte 1 = Pixel0 Bits 11-4
Byte 2 = Pixel1 Bits 3-0 + Pixel0 Bits 3-0
Byte 3 = Pixel1 Bits 11-4
我有一个文件,所有的字节都可以通过二进制读取来读取,假设它叫做
binfile

要从文件中获取像素数据,请执行以下操作:

from bitstring import BitArray as Bit

f = open(binfile, 'rb')
bytestring = f.read()
f.close()
a = []
for i in range(len(bytestring)/3): #reading 2 pixels = 3 bytes at a time
    s = Bit(bytes = bytestring[i*3:i*3+3], length = 24)
    p0 = s[0:8]+s[12:16]
    p1 = s[16:]+s[8:12]
    a.append(p0.unpack('uint:12'))
    a.append(p1.unpack('uint:12'))
这是可行的,但速度非常慢,我想更有效地做到这一点,因为我必须为大量的数据这样做

我的想法是,通过一次读取超过3个字节,我可以在转换步骤中腾出一些时间,但我想不出一种方法来实现这一点

另一个想法是,由于比特以4个为一组,也许有一种方法可以处理小字节而不是比特

数据示例:

字节

'\x07\x85\x07\x05\x9d\x06'
引出数据

[117, 120, 93, 105]

你试过位运算符吗?也许这是一种更快的方式:

with open('binfile.txt', 'rb') as binfile:
  bytestring = list(bytearray(binfile.read()))


a = []

for i in range(0, len(bytestring), 3):
  px_bytes = bytestring[i:i+3]
  p0 = (px_bytes[0] << 4) | (px_bytes[1] & 0x0F)
  p1 = (px_bytes[2] << 4) | (px_bytes[1] >> 4 & 0x0F)
  a.append(p0)
  a.append(p1)

print a
以open('binfile.txt','rb')作为binfile的
:
bytestring=list(bytearray(binfile.read()))
a=[]
对于范围内的i(0,len(bytestring),3):
px_字节=bytestring[i:i+3]
p0=(px_字节[0]4和0x0F)
a、 追加(p0)
a、 附加(p1)
打印
这还产生:
[117、120、93、105]


希望有帮助

你能解释一下,按位运算符中发生了什么以及为什么会起作用吗?当然可以,但我想看看维基百科之类的资料会更合理。为了让你继续下去,我会解释我为p0做了什么。我需要如下构造12位:位11..4来自字节1,而位3..0来自字节2的位3..0。为了把它们放在一起,首先我将字节1向左移动4位。所以我得到了第11…4位。为了得到位3..0,我用十六进制常量
0x0F
0b0001111
二进制)和按位
将它们从字节2中屏蔽出来。这样我就得到了第二部分。剩下的唯一一件事就是将它们与按位的
放在一起。我正在尝试p0:通过将
px_字节[0]
向左移动4位,最右边的4个位置变为零。对于
px\u字节[1]
的字节,这些字节将填充相应的前4个或后4个。and操作是仅用于这4位的位掩码。