• 締切済み

[python] で packの方法を教えてください

pythonで、バイナリファイルを扱おうと思います。 固定長の変数に、文字列と整数を代入する予定です。 環境は、Linuxのコマンドラインで使用します。 ---------------------------------- C言語で書くと、次のように成ります。 char[32] str; int [8] a; str = "test hoge"; a = 123; sprintf ("%32s%08d", str, a); //バイナリデータとして扱う ---------------------------------- 上記のように、文字列や数値をバイナリデータにしたいと思います。 最終的には、バイナリデータ・ファイルを生成します。 この場合、packを使えば出来そうですが、例題がなかなか見つからず困っています。 何か良い方法を知りませんか。 よろしくお願いします。 m(_ _)m

みんなの回答

  • goosyu
  • ベストアンサー率58% (36/62)
回答No.2

【追加情報】  pack('%dsL' % 32, str,a)  '%dsL'は'%ds'と'L'から構成されていて,「% 32」は'%ds'組み合わされ'32s'と同じ意味です。今回は文字数32文字を指定しやすくする為にわけていました。  続けて'L'はlong整数型4バイト(unsigned long)を表しています。  後は'32sL'で指定されたこの順番通りに参照する文字列(str),参照する整数型(a)を並べて記述します。  もし3つ目にunsigned long cを増やす場合は「pack('%dsLL' % 32, str,a,c) 」のように単純に追加が出来ます。  この's’とか’L'の意味については次のサイトを確認して下さい。他にも'H'とか'B'などあります。 http://www.python.jp/doc/release/lib/module-struct.html ※今更ですがaがint型(符号付き)であれば'L'ではなく'i'か'l'が妥当だったかもしれません。そのあたりは検討してみてください。

xcode_15
質問者

お礼

解説をして頂きまして、誠に有難う御座います。 慣れるまでは、読みにくい関数ですね。

  • goosyu
  • ベストアンサー率58% (36/62)
回答No.1

pythonはお勉強中ですが参考までにサンプルソースを貼っておきます。 strは32バイト,int a は4バイトとしています。 from struct import * str = 'test hoge' a = 123; try:   fp = open('test.bin', 'wb') except IOError:   print 'Open error', 'test.bin' else:   str0 = pack('%dsL' % 32, str,a)   fp.write(str0)   fp.close()

xcode_15
質問者

お礼

有難う御座います。 動作確認できました。 m(_ _)m 欲を言えば、「 pack('%dsL' % 32, str,a) 」の解説をして頂きますと、凄く助かります。 ・・・とはいえ、この辺は、パラメータを変えて理解を深めようと思います。