Есть ли лучшее решение для преобразования строки Python2.x в байты Python3.x? - PullRequest
0 голосов
/ 20 июня 2019

Я отправляю / получаю байты, используя библиотеку сокетов, и считываемые байты поступают в виде строки.Я хочу прочитать их в массив NumPy через

received_bytes = socket.recv(100)
#example: received_bytes = str(b'\x01\x01')
np.frombuffer(received_bytes, dtype="uint8")

, чтобы, если полученные байты были "b'\x01\x02'", я получил бы [1, 2].Однако сейчас я получу что-то вроде [92, 120, 48, 49, 92, 120, 48, 50], указывающее, что каждый символ преобразуется (92 <-> '\', 120 <-> 'x' и т. Д.) Вместо каждых 4символьная строка-байт.

О сокете: я использую Pybluez для работы по Bluetooth, но я на MacOS, у которой ограниченная поддержка, и поэтому я считаю, что у меня есть Pybluez - просто оболочка, использующая LightBlueпакет.Я подозреваю / почти уверен, что LightBlue написан на Python2.x, что объясняет, почему функция socket.recv() возвращает объект str вместо объекта bytes (так как Python2.x рассматривал два более взаимозаменяемо).Из-за этого, если нет лучшей библиотеки Bluetooth, которую я должен использовать (мне было трудно найти что-то, что работало бы на OSX и Python), то я застрял в поиске способа преобразования между строками Python3.x и байтами.Я попытался сделать это через библиотеку LightBlue и посмотреть, смогу ли я изменить способ возврата данных, но после нескольких слоев он появился для интерфейса некоторого кода ObjC, и я не был настолько уверен, что было «быстрое исправление»просто приведение чего-либо к байту вместо str ранее в конвейере.

К сожалению, np.fromstring () делает то, что я хочу, но это устарело и говорит использовать np.frombuffer (к которому я не могу добратьсяРабота).Я не хочу использовать np.fromstring (), потому что я не хочу полагаться на устаревший код (и каждый раз, когда он вызывается, он оставляет неприятное предупреждающее сообщение).Я также не уверен, почему я не могу эмулировать np.fromstring () с помощью np.frombuffer ()

Я пробовал много вещей, и несколько методов работали, но я боюсь, что они не самыеэффективный.

1.Единственное, что сработало помимо np.fromstring () - это следующее:

received_string = str(b'\x01\x02')
bytes = eval("b'" + received_string + "'")

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

2.Я использовал received.encode('unicode-escape') для преобразования строки в байты, но каждый раз я получал байтовые объекты вида b'\\x01\\x02' (обратите внимание на двойную косую черту), и это не соответствовало бы np.frombuffer ().Я также рассмотрел следующие связанные вопросы, но ни одно из этих решений не помогло мне:

Преобразование кодировки utf-8 с двойной косой чертой Преобразование байтовой / строковой кодировки python2 в python3

#What I want: (because np.frombuffer() will perform correctly on this)
a = b'\x01\x02'

#What I begin with:
b = str(a)

import codecs

print(codecs.encode(b, "latin-1"))
# >>> b"b'\\x01\\x02'"

b = b[2:-1] #b = \x01\x02
print(codecs.encode(b, "latin-1"))
# >>> b'\\x01\\x02' #DOUBLE SLASHES



...