2017-05-29 5 views
1

私はちょうど私のstruct.packが間違ったデータを書いていたことを見つけるために、〜30分のデバッグとダブルチェックのPython & C#コードを過ごしました。これを別々の呼び出しに分けたときにうまくいきます。グループ化されたstruct.packで間違ったデータが書き込まれるのはなぜですか?

これは、私はこれは私が今持っているもの

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)) 

ある

file.write(struct.pack("fffHf", kf_time/frame_divisor, kf_in_tangent, kf_out_tangent, kf_interpolation_type, 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タイプに適切な整列 を維持するためにパッドバイトを含む所定のC構造体をパック。同様に、開梱時には が考慮されます。この現象はそう充填構造体のバイトは、対応するCの構造体のメモリに レイアウトに正確に対応 選択されます。 ハンドルプラットフォームに依存しないデータフォーマットにまたは暗黙 パッドバイトを省略し、代わり ネイティブサイズとアライメントの標準サイズとアライメントを使用する:詳細​​を参照。

+0

そうですね、それが理由です。必要なエンディアンに応じて、フォーマット文字列の先頭に '='、 '<' or '>'を追加する必要があります。 –

+0

ここでは、 "/="はエンディアンのみを意味し、それ以外の効果はないと考えていました。ありがとう! – aaro4130

関連する問題