使用python可以解压缩mono12packed bitstring格式

时间:2017-03-02 10:59:05

标签: python bit-manipulation byte bit nibble

我有来自相机的原始数据,这是采用mono12packed格式。这是一种隔行位格式,用于以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

要从我执行的文件中获取pixeldata:

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]

1 个答案:

答案 0 :(得分:1)

您是否尝试过按位运算符?也许这是一种更快的方式:

function getList(where){
    var html = [];
    if($.isEmptyObject(where)) return;
    db.modules.where(where).each(function(item){
        html.push('<div class="module-item">');
        html.push('<div class="module-item-pic"><img src="' + item.modu_pic + '" class="img-fluid" /></div>');
        ....
        html.push('</div>')
        html.push('</div>');
    }).then(function () {
      console.log(html.join(''));
    });
}

这也输出: 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

希望它有所帮助!