Используйте шестнадцатеричный массив байтов Cython Python для указателя C char

Я хочу отправить шестнадцатеричный массив байтов на C, который преобразован в указатель char.

Это код части Cython.

cpdef c_write(int sd, char* buf, int len, unsigned int flags):
    send_message(sd, buf, len, flags)

И это код, который использует функцию Cython для реализации tcp / ip.

class TcpClient:
def __init__(self, host, port, timeout, block):
    self._host = host
    self._port = port
    self._timeout = timeout
    self._block = block
    self._sock = libtcp.c_create_socket()

def connect(self):
    libtcp.c_connect(self._sock, self._host.encode(), self._port)

def disconnect(self):
    libtcp.c_disconnect(self._sock)

def recv(self):
    libtcp.c_start_process()

def send(self, buf):
    libtcp.c_write(self._sock, buf, len(buf), 0)

def register_recv_message_callback(self, py_func):
    libtcp.c_register_recv_message_callback(self._sock, py_func)

client = TcpClient("127.0.0.1", 2000, 10, True)
client.connect()
client.send("abc".encode())

Когда я отправляю "abc", все работает хорошо. Но когда я отправляю шестнадцатеричный массив, например:

b'\x02\x00\x08\x00'

Он просто получит 1 размер массива. Может быть, из-за косой черты '\'.

Итак, как мне решить эту проблему?

Это просто C, игнорирующий параметр len и предполагающий, что первый 0 завершает строку?

DavidW 03.07.2018 18:32

Да. верно!!! Если я попытаюсь изменить байты, например '\\ x02 \\ x00 \\ x08 \ x00', все будет в порядке

Juggles 04.07.2018 06:58

Теперь я знаю, в чем проблема. Это просто вызвано printf в c. Я использую pritf ("% s") для распечатки шестнадцатеричного массива, поэтому он просто выводит первый символ :(.

Juggles 04.07.2018 07:58
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
198
0

Другие вопросы по теме