@Nahs

Как выполнить xor строки?

Есть список значений различных типов. По условию необходимо "вычислить как логическая операция «исключающее ИЛИ» всех байтов" значение контрольной суммы.

b0 = 1
b1 = 1
b2 = 4
b3 = 'ной'

csum = b0^b1^b2^b3

Должно получиться
csum=b'\xee'
  • Вопрос задан
  • 1858 просмотров
Решения вопроса 1
@nirvimel
Боюсь что универсального решения для любых типов данных достичь не получится хотя бы потому что внутреннее представление различных типов зависит от интерпретатора и платформы, и в общем случае непостоянно.
Но для str и int могу предложить такое решение:
def xor_bytes(data):
    accumulator = 0
    for item in data:
        if isinstance(item, int):
            string = to_bytes(item)
        elif isinstance(item, str):
            string = item
        else:
            raise Exception('Invalid item type')
        for char in string:
            accumulator ^= (ord(char) & 0xff)
    return accumulator

И вспомогательная функция для python2, в котором int.to_bytes() не существует:
def to_bytes(n, length=8, endianess='big'):
    h = '%x' % n
    s = ('0'*(len(h) % 2) + h).zfill(length*2).decode('hex')
    return s if endianess == 'big' else s[::-1]
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@throughtheether
human after all
Есть устройство, получающий пакет данных и выводящее переданный в пакете текст.
...
Контрольная сумма вычисляется как xor всех байтов с 4 по 7.
На мой взгляд, проще всего сначала запаковать все ваши строки и числа в байты при помощи модуля struct (struct.pack), а затем уже xor-ить нужные байты.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы