16-битная искусственная сумма в Python - PullRequest
0 голосов
/ 27 марта 2019

Я работаю над программой, которая создает данные IRIG106 Chapter 10 для проекта cube-sat.В настоящее время он реализуется в python, и у меня возникают трудности с реализацией последнего компонента заголовка главы 10.

Способ, которым я реализовал это, в настоящее время я нахожу значения контрольной суммы, которые больше, чем то, что будет соответствовать внутри целого числа размера, определенного спецификацией (2 байта).

Стандарт определяет контрольную сумму заголовка в разделе 10.6.1.1 параграфа "J" стандарта IRIG 106-09 .Это определяется следующим образом:

J Контрольная сумма заголовка.(2 байта) содержит значение, представляющее 16-разрядную арифметическую сумму всех 16-разрядных слов в заголовке, кроме слова контрольной суммы заголовка.

Существует также руководство по программированию при условии, что есть пример кода C, который показывает следующее (со страницы A-2-17):

uint16_t I106_CALL_DECL uCalcHeaderChecksum(SuI106Ch10Header * psuHeader)
{
    int iHdrIdx;
    uint16_t uHdrSum;
    uint16_t * aHdr = (uint16_t *)psuHeader;

    uHdrSum = 0;
    for (iHdrIdx=0; iHdrIdx<(HEADER_SIZE-2)/2; iHdrIdx++)
        uHdrSum += aHdr[iHdrIdx];

    return uHdrSum;
} 

Я реализовал следующее в Python, используя библиотеку BitString :

def calculate_checksum(byte_data: BitArray = None, header_length_bytes: int = 24, chunk_length: int = 16): 

    # Set the checksum to zero:
    checksum = 0

    # Loop through the Chapter 10 header and compute the 16 bit arithmetic sum:
    for bit_location in range(0, (header_length_bytes-2), chunk_length):

        # Get the range of bits to select:
        bit_range = slice(bit_location, (bit_location + chunk_length))

        # Get the uint representation of the bit data found: 
        checksum += Bits(bin=byte_data.bin[bit_range]).uint

    # Write the computed checksum as binary data to the start location of the checksum in the header: 
    byte_data.overwrite(Bits(uint=checksum, length=chunk_length), (header_length_bytes-2*8))

Буду очень признателен за любые мысли или идеи, которые вы можете предоставить.Я знаю, что это должно быть простое решение, но я просто не могу его увидеть.

--- Обновление 2 --- Я попытался выполнить как опрокидывание, так и усечение, и они оба дали один и тот же результат:

test_value = 2**16
test_value1 = test_value + 500
test_value2 = test_value1 % (2**16) -> 500
test_value3 = test_value1 & 0xFFFF -> 500

--- Обновление 3 ---

Когда я сравниваю выполнение функций контрольной суммы python и C, я столкнулся со следующим, используя эти значения в качестве входных данных для спецификации:

Sync = "EB25" (2 bytes)
ChannelID = 1 (2 bytes)
PacketLen = 1024 (4 bytes) 

Когда я сравниваю результаты на каждом шаге, я вижу следующее:

C:

Header0: EB25                                                                                                                                                                                                               
 index =  0 16bit chunk = 60197 checksum = 60197                                                                                                                                                                            
Header1: 0001                                                                                                                                                                                                               
 index =  1 16bit chunk =     1 checksum = 60198                                                                                                                                                                            
Header2: 0400                                                                                                                                                                                                               
 index =  2 16bit chunk =  1024 checksum = 61222                                                                                                                                                                            
Header3: 0000                                                                                                                                                                                                               
 index =  3 16bit chunk =     0 checksum = 61222

Python:

eb25
index:  0 chunk: 60197 checksum: 60197
0001
index:  1 chunk:     1 checksum: 60198
0000
index:  2 chunk:     0 checksum: 60198
0400
index:  3 chunk:  1024 checksum: 61222
...