Найти - Пользователи
Полная версия: функция записи данных
Начало » Python для новичков » функция записи данных
1
Dmitry_K
Добрый день, прошу помощи разобраться в написании небольшой функции:
есть простой скрипт

 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’

видимо я что-то где-то не правильно передаю? подскажите что может быть не так, спасибо.
py.user.next
Передай код точно. Используй тег
[code python][/code]
Dmitry_K
py.user.next
Передай код точно. Используй тег
исправил, спасибо за замечание, я тут в первые.
py.user.next
Работай с байтами как с числами, а не как со строками
  
>>> 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.
Dmitry_K
спасибо, за рекомендации буду разбираться
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB