2013-07-15 75 views
0

有沒有人有關於如何打包頭文件的任何提示,然後將其附加到某些數據塊?例如,如果我有一個16位字節的位填充標頭,然後我想將它附加到大約2MB的原始RGB圖像,那麼執行此操作的最有效方法是什麼?在Python中合併打包的頭文件和numpy數組

到目前爲止,我已經試過以下

headerVals = (str(headerVersion), str(formatEnum), frameCount, ntpTimestamp, width, height) 
packedHdr = self.imgStruct.pack(*headerVals) 

return packedHdr + data 

但是這個失敗,出現以下錯誤,因爲海峽和numpy的陣列的arent concat'able:

return packedHdr + data 
TypeError: cannot concatenate 'str' and 'numpy.ndarray' objects 

唯一的辦法解決這一點,作爲一名Python初學者,我可以想到下面這些顯而易見的原因是非常緩慢的:

# Generate the header 
headerVals = (str(headerVersion), str(formatEnum), frameCount, ntpTimestamp, width, height) 

packDir = 'cchqhh{0}h'.format(width*height*3) 

return pack(packDir, str(headerVersion), str(formatEnum), frameCount, ntpTimestamp, width, height, *data) 

有什麼建議嗎?作爲Python的發起者,我發現自己有點被這個難住了!

UPDATE:

按以下賽斯的建議,我更新了我的代碼以下內容,它是工作很好。

# Generate the header 
headerVals = (str(headerVersion), str(formatEnum), frameCount, ntpTimestamp, width, height) 
packedHdr = self.imgStruct.pack(*headerVals) 

# Concatanate header to the data 
return numpy.concatenate((numpy.fromstring(packedHdr, dtype=numpy.uint8), data), axis=0) 
+0

爲什麼不把'headerVersion'和'formatEnum'放在一個numpy數組中,然後嘗試連接? – seth

+0

我最終採取了這種方法,它似乎工作。對問題 – bgoldber

+0

添加更改沒關係,我會將我的評論作爲答案。 – seth

回答

1

要連接你的頭和numpy數組,你需要以二進制形式存儲數組。假設data是int數組:

import struct 

raw_data = packedHdr + struct.pack('i' * data.size, *data) 

如果你的數據是不同類型的,你需要在st.pack指定它。然後您可以將所得到的raw_data以所需的格式打包。

+0

所以這是有效的,但我認爲效率並不是很高,因爲數據在幕後落入數據大小,對吧? – bgoldber

+0

@bgoldber這確實會使你的數據在內存中增加一倍,但它應該放在與原始numpy數組相同的數據類型中(否則你會以錯誤的格式打包數據表示!)。對於2Mb的圖像來說,這非常簡單,性能問題應該很小,除非你這麼做。 – tiago

0

爲什麼不把headerVersionformatEnum放在一個numpy數組中,然後嘗試連接?