2011-01-18 46 views
1

は、ここに私のコード(py3.1)です。なぜ私は文字列を取得していないのですか?struct.unpack戻っていない文字列

+3

'bytes'を' str'に変換したいのであれば、それは間違っています(tm)。 'struct'は密接にレイアウトされたバイナリ(!)データを扱うためのものです。 – delnan

+0

それは私が扱っていることです。 MESHなどは、バイナリデータの中の単なるラベルです。 – Artfunkel

答えて

2

。あなたが見せてくれたことは誤りでした。また、人々が推測する必要がないように、コードスニペットにすべての情報が含まれていることを確認してください。

>>> chars = "MESH" # guess 
>>> binchars = b"MESH" # guess 
>>> struct_fmt = "{}s".format(chars) # what you showed 
>>> struct_fmt 
'MESHs' ############### won't work 
>>> import struct 
>>> struct.unpack(struct_fmt, binchars) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
struct.error: bad char in struct format ############ didn't work 
>>> struct_fmt2 = "{}s".format(len(chars)) # what you probably did use 
>>> struct_fmt2 
'4s' #### looks much better 
>>> struct.unpack(struct_fmt2, binchars) 
(b'MESH',) ### did work 
>>> 

マニュアル「は、結果として得られるバイトオブジェクトをアンパックについては...」と言うよう

+0

私は投稿しました私のコードとそれは動作します、ありがとう。 'chars'は、あなたが"推測 "している文字列そのものではなく、望む文字列の文字数です。 (それはあなたが質問に答えたように見えるので、私はあなたを許します。) – Artfunkel

+0

charsは整数の適切な名前ではありません、フォーマット( '{}')はまったく手がかりを与えませんでした。誰かがあなたがしていたことを再現できるように、全コード( 'self.get_bin(chars)' ???)を表示していませんでした。実際に、あなたが意図したことを実証するために必要なのは、 'struct.unpack(" 4s "、" b "MESH") ' –

0

これは動作します:

return struct.unpack("{}s".format(chars),self.get_bin(chars))[0].decode('ASCII') 

をしかしunpack()はこの自体を行うことを怠った理由を説明しません。答えが出るまで質問を開いたままにしておきます。

編集:ジェイソンの改善:

return self.get_bin(chars).decode('ASCII') 

が本当に構造体の嘲笑を作ります...あなたはコードはあなたが実行しなかったものを実際にあることを確認している場合質問をするときに役立ちます

+0

私は混乱しています...なぜあなたは 'struct'が文字列をデコードすると思いますか?そして、たとえ 'struct'がこれを行うと予想されても、' struct.unpack'は文字列がASCIIかUTF8か他のタイプのユニコードかどうかを自動的に推測できますか? –

+0

'10s> char [10]'と '10w> wchar_t [10]'?私は実際に方法があると仮定しています、それは*文字列を行うことを主張します。 – Artfunkel

+1

"うまくいく":もちろん、それだけであれば 'struct'は必要ありません...' 'struct'は" <4s2H2Bd "のようなフォーマットを必要とする構造体のためです –

0

アンパックタプル、この場合、長さ1のタプルを返します。

は、あなたが持っているものの最後に[0]

を追加し、それはあなたが期待するもの与える必要があります。

関連する問題