Как рассчитать CR C для коррекции кадра rnet? - PullRequest
1 голос
/ 25 января 2020

Мне нужно реализовать проверку ошибок для простого rnet кадра. Как я могу это реализовать?

Я просмотрел несколько документов, чтобы понять, как проверить правильность кадра rnet. Я попытался реализовать алгоритм, описанный на странице википедии (в swift 5.1):

    // we run the calculation over all the frame except the CRC itself (last 4 bytes)
    var crc : UInt32 = 0xFFFFFFFF
    for x in 0..<(packetLength-4) {
        let byte = packetBytes[x]
        let nLookupIndex : UInt32 = (crc ^ byte) & 0xFF
        crc = (crc >> 8) ^ crcTable[Int(nLookupIndex)]
    }

    // This is the end padding (adding 4 bytes with 0 at the end)
    for x in 0..<4 {
        let byte : UInt32 = 0
        let nLookupIndex : UInt32 = (crc ^ byte) & 0xFF
        crc = (crc >> 8) ^ crcTable[Int(nLookupIndex)]
    }

, где crcTable выглядит так:

let crcTable = [0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, .... 0x5a05df1b, 0x2d02ef8d]

Я могу вижу, что это неправильно, потому что это не дает мне cr c, который я вижу в ethe rnet кадров. Кто-нибудь может указать на то, что я делаю неправильно?

1 Ответ

0 голосов
/ 27 января 2020

Включите данные и CR C в расчет. Поскольку CR C дополняется после записи, пересчет CR C будет иметь ненулевую константу, 0x2144DF1 C.

Измените код на:

    var crc : UInt32 = 0xFFFFFFFF
    for x in 0..<(packetLength) {           // fix
        let byte = packetBytes[x]
        let nLookupIndex : UInt32 = (crc ^ byte) & 0xFF
        crc = (crc >> 8) ^ crcTable[Int(nLookupIndex)]
    }
    if (crc != 0x2144DF1C){                 // if CRC != 0x2144DF1C
        // ...                              //   it is bad CRC
    }

Всякий раз, когда CR C дополняется после записи, пересчет CR C данных плюс CR C приводит к ненулевой константе, в этом случае 0x2144DF1 C (если CR C не дополняется постом, пересчитанный CR C будет равен нулю).

...