Python BCD, разделяющий кусочки и конкатенацию 2 целых

Я чувствую себя полным инструментом для публикации этого, это настолько просто, и я не могу поверить, что потратил последние два дня на эту проблему. Я пробовал все решения, которые я мог найти по этому поводу (серьезно, я покажу вам свою интернет-историю), но безрезультатно. Вот проблема:

Я разбираю последовательную строку из UC. Он имеет длину 52 байта и содержит множество различных переменных данных. Данные закодированы в упакованном двоично-десятичном коде.

Ex: .....blah.....0x01 0x5E .....blah

015E hex дает десятичное число 350. Это значение, которое я хочу. Я отлично читаю последовательную строку, я использовал binascii.hexify для печати байтов, чтобы убедиться, что они правильные. я использую

data = ser.read()

и помещал данные в массив, если перевод строки не получен. Я пытался сделать массив байтовым массивом, списком, всем, что я мог найти, но ничего не работает.

Я хочу отправить требуемый двухбайтовый раздел определенному методу.

def makeValue(highbyte, lowbyte)

Когда я пытаюсь использовать распаковку, соединение, упаковку, манипуляции с битами, концентрацию строк, я продолжаю сталкиваться с одной и той же проблемой.

Поскольку 0x01 и 0x5E не являются допустимыми числами int (начало заголовка и ^ в ASCII), это не сработает. Он даже не позволит мне сначала присоединиться к числам, потому что это недопустимый int.

using hex(): hex argument can't be converted to hex. Joining the strings: invalid literal for int() with base 16: '\x01^' using int: invalid literal for int() with base 10: '\x01^' Packing a struct: struct.error: cannot convert argument to integer

Серьезно, я пропустил что-то действительно основное здесь? Все примеры, которые я могу найти, отлично используют все вышеперечисленные функции, но в них указаны шестнадцатеричные числа «0x1234» или числа, которые они преобразуют, являются фактическими числами ASCII. Пожалуйста помоги.

РЕДАКТИРОВАТЬ Я понял, ч3ка наставила меня на правильный путь, огромное спасибо!

Я не знаю, почему это не сработало раньше, но я зашифровал оба значения.

one = binascii.hexlify(line[7])
two = binascii.hexlify(line[8])
makeValue(one, two)` 

а затем использовал char makeValues ​​ch3ka, определенный:

def makeValue(highbyte, lowbyte)
    print int(highbyte, 16)*256 + int(lowbyte, 16)

Еще раз спасибо!!!


person morale_low    schedule 18.04.2012    source источник


Ответы (1)


вы интерпретируете значения как символы. Передача символов в int() не будет работать, вы должны передать значения в виде строк, например: int("0x5E", 16). То, что вы пытаетесь сделать, на самом деле int(chr(int("0x5E", 16)),16), то есть int("^",16), и, конечно, не сработает.

Вы ожидаете таких результатов?

makevalue('0x01', '0x5E') ->  350 0x15e 0b101011110
makevalue('0xFF', '0x00') ->  65280 0xff00 0b1111111100000000
makevalue('0x01', '0xFF') ->  511 0x1ff 0b111111111
makevalue('0xFF', '0xFF') ->  65535 0xffff 0b1111111111111111

Если это так, вы можете использовать это:

def makeValue(highbyte, lowbyte):
    return int(highbyte, 16)*256 + int(lowbyte, 16)

или ИМО более уродливый и подверженный ошибкам:

def makeValue(highbyte, lowbyte):
    return int(highbyte+lowbyte[2:], 16) # strips leading "0x" from lowbyte be4 concat
person ch3ka    schedule 18.04.2012
comment
большое вам спасибо за вашу помощь. К сожалению, он до сих пор не работает. Когда я пробую первое makeValue, я получаю: invalid literal for int() with base 16: '\x01' Второе дает 'invalid literal for int() with base 16: '\x015E'', которое является значением, которое я хочу в шестнадцатеричном формате, но все еще не разрешено? - person morale_low; 18.04.2012
comment
вы не должны передавать \. Просто передайте 0x01 и 0x5E. как струны. - person ch3ka; 18.04.2012