struct.unpack не возвращает строки - PullRequest
1 голос
/ 18 января 2011

Вот мой код (py3.1):

def get_string(self,chars):
    return struct.unpack("{}s".format(chars),self.get_bin(chars))

b'MESH' входит, (b'MESH',) выходит. Почему я не получаю строку?

Ответы [ 3 ]

2 голосов
/ 19 января 2011

При задании вопросов полезно убедиться, что код действительно соответствует тому, что вы выполняли.То, что вы показываете, дало бы ошибку.Также убедитесь, что фрагмент кода включает в себя всю информацию, так что людям не нужно угадывать.

>>> 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 голосов
/ 19 июня 2014

unpack возвращает кортеж, в данном случае кортеж длины 1.

Добавить

[0]

до конца того, что у вас есть, и оно должно дать то, что вы ожидаете.

0 голосов
/ 18 января 2011

Это работает:

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

Но не объясняет, почему unpack() пренебрегает сделать это сам.Я оставлю вопрос открытым, пока на него не будет ответа.

Редактировать: Улучшение Джейсона:

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

Делает насмешку над структурой действительно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...