Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 6, 2020 15:35:43

Dmitry_K
Зарегистрирован: 2020-06-06
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

функция записи данных

Добрый день, прошу помощи разобраться в написании небольшой функции:
есть простой скрипт

 import socket
import re
HOST = '192.168.100.252'
PORT = 2000
# reverse func
def reverse_per_two_char(chars):
    '''
    reverse '010203' to '030201'
    '''
    return ''.join(reversed(re.findall('..?', chars)))
    
#есть функция которая собирает из частей строку в 16тиричном формате и отправляет в порт на #указаный IP
def write_register(start_digit, digit_num=1, port=PORT, host=HOST, dic=True):
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect((host, port))
    cmd = '500000ffff03000e00100001140000'\
            + reverse_per_two_char('{:0=6x}'.format(start_digit))\
            + 'a8' + reverse_per_two_char('{:0=4x}'.format(digit_num))\
            + reverse_per_two_char('{:0=4x}'.format(int('0003')))
    msg = bytes.fromhex(cmd)
    client.send(msg)
    res = client.recv(1024).hex()
    if dic:
        return {start_digit: int(reverse_per_two_char(res[-4*digit_num:]), 16)}
    else:
        return int(reverse_per_two_char(res[-4*digit_num:]), 16)
testregD1 = write_register(1, 1)
print('D1: ', testregD1)

не получается вынести int('0003')) в аргумент функции
если передавать в переменной cmd все работает
пробовал вот так:

 def write_register(start_digit, write_data, digit_num=1, host=HOST, port=PORT, dic=True):
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect((host, port))
    cmd = '500000ffff03000e00100001140000'\
            + reverse_per_two_char('{:0=6x}'.format(start_digit))\
            + 'a8' + reverse_per_two_char('{:0=4x}'.format(digit_num))\
            + reverse_per_two_char('{:0=4x}'.format(int[b](write_data[/b], 16)))
    msg = bytes.fromhex(cmd)
    client.send(msg)
    res = client.recv(1024).hex()
    if dic:
        return {start_digit: int(reverse_per_two_char(res[-4*digit_num:]), 16)}
    else:
        return int(reverse_per_two_char(res[-4*digit_num:]), 16)
testregD1 = write_register(1, 1, '0001')
print('D1: ', testregD1)
передаю функции: write_register строку ‘0001’
ошибка:
Traceback (most recent call last):
File “test_write_cmd.py”, line 40, in <module>
testregD1 = write_register(1, 1, ‘0001’)
File “test_write_cmd.py”, line 29, in write_register
+ ‘a8’ + reverse_per_two_char('{:0=4x}'.format(digit_num))\
ValueError: Unknown format code ‘x’ for object of type ‘str’

видимо я что-то где-то не правильно передаю? подскажите что может быть не так, спасибо.

Отредактировано Dmitry_K (Июнь 6, 2020 16:07:15)

Офлайн

#2 Июнь 6, 2020 15:57:55

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10026
Репутация: +  857  -
Профиль   Отправить e-mail  

функция записи данных

Передай код точно. Используй тег

[code python][/code]



Офлайн

#3 Июнь 6, 2020 16:06:25

Dmitry_K
Зарегистрирован: 2020-06-06
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

функция записи данных

py.user.next
Передай код точно. Используй тег
исправил, спасибо за замечание, я тут в первые.

Офлайн

#4 Июнь 6, 2020 18:57:09

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10026
Репутация: +  857  -
Профиль   Отправить e-mail  

функция записи данных

Работай с байтами как с числами, а не как со строками

  
>>> b = bytearray([1, 2, 3, 4, 5])
>>> b
bytearray(b'\x01\x02\x03\x04\x05')
>>> 
>>> b.insert(2, 7)
>>> b
bytearray(b'\x01\x02\x07\x03\x04\x05')
>>> 
>>> b[2:2] = [10, 11, 12]
>>> b
bytearray(b'\x01\x02\n\x0b\x0c\x07\x03\x04\x05')
>>> 
>>> b.hex()
'01020a0b0c07030405'
>>> 
>>> b.hex().upper()
'01020A0B0C07030405'
>>>
>>> b.reverse()
>>> b.hex().upper()
'050403070C0B0A0201'
>>>

Dmitry_K
ValueError: Unknown format code 'x' for object of type 'str'
видимо я что-то где-то не правильно передаю? подскажите что может быть не так, спасибо.
У тебя архитектура неправильная. Работа со строками вместо чисел выплыла на формате. Спецификатор формата x применяется только к числам. При этом, если взять число вместо строки, там пропадут ведущие нули. С байтами надо работать с помощью специальных инструментов для этого - байтовые литералы (b'\x01\x02\x03') , bytes, bytearray, модуль struct.



Отредактировано py.user.next (Июнь 6, 2020 19:00:07)

Офлайн

#5 Июнь 7, 2020 15:13:00

Dmitry_K
Зарегистрирован: 2020-06-06
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

функция записи данных

спасибо, за рекомендации буду разбираться

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version