2017-03-02 52 views
1

我有一個攝像機的原始數據,它是mono12packed格式。這是一種隔行位格式,用3個字節存儲2個12位整數以消除開銷。明確每個3個字節的內存佈局是這樣的:用python輕鬆解開mono12packed bitstring格式

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] 

回答

0

你試過位運算的數據?也許這是一個更快的方法:

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 

這也輸出: [117, 120, 93, 105]

希望它能幫助!

+0

差不多200倍!太棒了,謝謝你! – Dschoni

+0

您能否解釋一下,在按位運算符中發生了什麼,以及爲什麼這會起作用? – Dschoni

+0

當然我可以,但我想看看維基百科https://en.wikipedia.org/wiki/Bitwise_operation等來源更合理。 – Szabolcs