2015-04-17 5 views
1

Я использую bytearrays в python 2.7 для анализа потока данных, поступающего из последовательного порта. Я столкнулся с странным поведением: я пытаюсь вычислить контрольную сумму полученного пакета, чтобы проверить его достоверность, но у меня возникают проблемы с функцией sum() над bytearray. Я бы предположил, что, будучи байтарием массива байтов, он будет суммировать каждый байт друг с другом, верно? Только это не ..Сумма Bytearray в python

Например: У меня есть этот пакет

str = '200a02daffe0fe3d140500f6fff6ff6df42c0aabfe' 
b = bytearray(str) 

Суммируя его содержание выходов:

sum(b) 
3263 

Правильный результат будет

2915 

в по крайней мере, это то, что говорит калькулятор. Эта функция:

def somma_hex(str): 
    s = 0 
    for i in range(0,len(str)-1,2): 
     s += int(byte[i:i+2],16) 

выдает правильное значение, 2915.

Это не большая проблема, я могу использовать простую функцию, которую я написал вместо sum(), но мне было интересно, что происходит?

Благодаря

+4

Вы суммируете bytearray шестнадцатеричных цифр. Конечно, ответ будет неправильным. Попробуйте использовать 'binascii', чтобы сначала декодировать шестнадцатеричный байты. – nneonneo

+0

Декодирование на самом деле сделал трюк. 'sum (bytearray (str.decode (" hex ")))' дает правильный результат. – powder

+0

FWIW, 'bytearray' имеет метод [fromhex] (https://docs.python.org/3.1/library/stdtypes.html#bytearray.fromhex) – kalhartt

ответ

0

ByteArray имеет 42 8-битовых элементов, анализируемые по сумме(). В somma_hex вы разбиваете его на двухбайтовые куски и разбираете их как 16-битное целое число. Факты очевидны.

+0

Прошу прощения, код, который я опубликовал, был недостаточно ясен , в 'somma_hex()' я передаю шестнадцатеричную строку, поэтому суммирование двух символов за один раз фактически приводит к 1 байт – powder

Смежные вопросы