Шаньдун kaitai структура: вращать сдвиг >1 байт групп


Это реализация вращение (циклический сдвиг) много-байтовых групп слева. Правый поворот поддерживается как отрицательная сумма. Я хотел бы попросить, если кто-то бы желал, чтобы ознакомиться с настоящим Кодексом за правильность и производительность. Как в Python 2 и 3 нуждаются в поддержке.

Этот код является частью системы Шаньдун kaitai структуры. Текущей реализации можно найти здесь. Ниже код в PR #28, необъединенные.

Есть какой-то тест для этой функции здесь.

Код поддержки:

if PY2:
    range = xrange
    def integers2bytes(ints):
        return bytes(bytearray(ints))
    def bytes2integers(data):
        return bytearray(data)
else:
    def integers2bytes(ints):
        return bytes(ints)
    def bytes2integers(data):
        return data

Основной код:

class KaitaiStream(object):

    # formula taken from: http://stackoverflow.com/a/812039
    precomputed_single_rotations = {amount: [(i << amount) & 0xff | (i >> (8-amount)) for i in range(256)] for amount in range(1,8)}

    @staticmethod
    def process_rotate_left(data, amount, group_size):
        amount = amount % (group_size * 8)
        if amount == 0:
            return data
        data_ints = bytes2integers(data)

        if group_size == 1:
            translate = KaitaiStream.precomputed_single_rotations[amount]
            return integers2bytes(translate[a] for a in data_ints)

        if len(data) % group_size != 0:
            raise Exception("data length must be a multiple of group size")

        if amount % 8 == 0:
            indices = [(i + amount//8) % group_size for i in range(group_size)]
            return integers2bytes(data_ints[i+k] for i in range(0,len(data),group_size) for k in indices)

        amount1 = amount % 8
        amount2 = 8 - amount1
        indices_pairs = [ ((i+amount//8) % group_size, (i+1+amount//8) % group_size) for i in range(group_size)]
        return integers2bytes((data_ints[i+k1] << amount1) & 0xff | (data_ints[i+k2] >> amount2) for i in range(0,len(data),group_size) for k1,k2 in indices_pairs)


136
2
задан 4 апреля 2018 в 09:04 Источник Поделиться
Комментарии