2017-05-29 71 views
1

我剛剛花了大約30分鐘的時間調試並仔細檢查Python & C#代碼,發現我的struct.pack正在寫入錯誤的數據。當我把它分成不同的調用時,它工作正常。爲什麼分組的struct.pack會寫入錯誤的數據?

這是我

file.write(struct.pack("fffHf", kf_time/frame_divisor, kf_in_tangent, kf_out_tangent, kf_interpolation_type, kf_value)) 

這是我現在有

file.write(struct.pack("f", kf_time/frame_divisor)) 
file.write(struct.pack("f", kf_in_tangent)) 
file.write(struct.pack("f", kf_out_tangent)) 
file.write(struct.pack("H", kf_interpolation_type)) 
file.write(struct.pack("f", kf_value)) 

爲什麼第一個變化不寫,我所期望的數據之前有?與分別寫這些有什麼不同?

(文件以二進制模式打開,平臺是64位Windows的Python 3.5)

+0

你能提供一個MCVE嗎? _https://stackoverflow.com/help/mcve_ – CIsForCookies

+0

你在哪個平臺上?這是Python 2還是3?你是否以二進制模式打開文件? –

+0

64位Windows。 Python 3.5。文件以二進制模式打開。 – aaro4130

回答

3

大概是因爲,作爲struct文件明確規定:

注意默認情況下,結果打包給定的C struct 包含填充字節,以便爲所涉及的C類型保持正確的對齊 ;同樣,在解包時考慮對齊 。這種行爲被選擇爲 ,使得打包結構的字節完全對應於相應C結構的存儲器中的佈局 。若要 處理與平臺無關的數據格式或省略隱含的 填充字節,請使用標準大小和對齊代替 本機大小和對齊:有關詳細信息,請參閱​​。

+0

是的,這就是原因。您應該在格式字符串的開頭添加'=','<' or '>',具體取決於您想要的字節順序。 –

+0

在這裏,我認爲「/=」只意味着排序,除此之外沒有任何效果。謝謝! – aaro4130