- 締切済み
[python] で packの方法を教えてください
pythonで、バイナリファイルを扱おうと思います。 固定長の変数に、文字列と整数を代入する予定です。 環境は、Linuxのコマンドラインで使用します。 ---------------------------------- C言語で書くと、次のように成ります。 char[32] str; int [8] a; str = "test hoge"; a = 123; sprintf ("%32s%08d", str, a); //バイナリデータとして扱う ---------------------------------- 上記のように、文字列や数値をバイナリデータにしたいと思います。 最終的には、バイナリデータ・ファイルを生成します。 この場合、packを使えば出来そうですが、例題がなかなか見つからず困っています。 何か良い方法を知りませんか。 よろしくお願いします。 m(_ _)m
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- goosyu
- ベストアンサー率58% (36/62)
【追加情報】 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'が妥当だったかもしれません。そのあたりは検討してみてください。
- goosyu
- ベストアンサー率58% (36/62)
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()
お礼
有難う御座います。 動作確認できました。 m(_ _)m 欲を言えば、「 pack('%dsL' % 32, str,a) 」の解説をして頂きますと、凄く助かります。 ・・・とはいえ、この辺は、パラメータを変えて理解を深めようと思います。
お礼
解説をして頂きまして、誠に有難う御座います。 慣れるまでは、読みにくい関数ですね。