Возникла проблема с запуском create_string_buffer в python3 Enviroments - PullRequest
1 голос
/ 04 мая 2020

Это мой пример Python 3 кода.

from ctypes import create_string_buffer
import struct
...

# self.payload is None / max is integer
self.payload = create_string_buffer(max)

# self.payload is ctypes.c_char_Array_3
struct.pack_into(str(max) + "s", self.payload, 0, padding)

Это код ошибки

struct.error: argument for 's' must be a bytes object

Этот пример кода хорошо работал в среде Python2. Однако указанный выше код ошибки был найден в процессе преобразования в python3.

Итак, принудительное преобразование self.payload в байты (self.payload.raw) приводит к следующему коду ошибки.

TypeError: argumnet must be read-write bytes-like object, not bytes

Как исправить эти ошибки и запустить их в среде python3?

1 Ответ

1 голос
/ 04 мая 2020

Листинг [Python 3.Docs]: struct - интерпретировать строки как упакованные двоичные данные .

Все изменилось между Python 2 и Python 3 относительно строк. Проверьте [SO]: передача строки utf-16 в функцию Windows (ответ @ CristiFati) для получения более подробной информации.

Хотя это только предположительно (поскольку в вопросе отсутствуют соответствующие части код (это плохо написано)), виновник полезная нагрузка , потому что это аргумент, который соответствует формату "* s " (и это совсем не так относится к self.payload ). Таким образом, строка должна быть:

struct.pack_into(str(length) + "s", self.payload, 0, padding.encode())

Кроме того, используйте другое имя для max ( например length ), так как вы ' Повторная тень на встроенную функцию.

...