Использование структуры стиля c в Python - PullRequest
0 голосов
/ 03 февраля 2019

Я пишу скрипт на python и всю жизнь работал только на C и C ++.То, что я хочу, это взять некоторые параметры из вызывающей стороны, а затем создать 32-байтовый пакет.Пакет содержит несколько байтов, несколько DWORDS, некоторые битовые поля и т. Д. Поэтому я хочу создать этот пакет, а затем скопировать его по байту (это важно) в буфер, который выделяется драйвером низкого уровня.

В C / C ++ это просто.Определите структуру, запрограммируйте поля, а затем прочитайте ее побайтно и скопируйте в буфер.

Как я могу сделать это в Python?Похоже, я не могу определить класс / структуру, которая содержит мой 32-байтовый пакет, а затем перебрать его членов, чтобы скопировать их побайтно.

Есть предложения?

1 Ответ

0 голосов
/ 03 февраля 2019

Python 3 имеет специальный тип для двоичных строк , называемых байтами, в отличие от строк Unicode.Это отличается от Python 2, где это был строковый тип по умолчанию.

Самый простой способ создать его - это struct.pack с его строками формата .Например, если у вас есть беззнаковое короткое , за которым следует подписанное короткое в вашей структуре, и вы хотите закодировать их в сетевом порядке байтов (он же big endian):

import struct
data = struct.pack('>Hh', 0xAFFE, -5)

Это создает строку байтов b'\xaf\xfe\xff\xfb'.Вы можете получить доступ к первому байту с данными [0] или перебрать их с помощью for byte in data: или получить len (данные) и т. Д.

Вы можете записать их в файл (устройства) в двоичном режиме, например:

with open('/dev/myfile', 'wb') as f:
    f.write(data)

Или отправить их через сокет UDP:

from socket import socket, AF_INET, SOCK_DGRAM
sock = socket(AF_INET, SOCK_DGRAM)
sock.sendto(data, ('127.0.0.1', 9999))

В структурном модуле Python 3 есть больше примеров .

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