CheckSum8 Modulo 256 Swift - PullRequest
       2

CheckSum8 Modulo 256 Swift

0 голосов
/ 01 марта 2019

У меня есть массив UInt8, и я хочу вычислить CheckSum8 по модулю 256. Если сумма байтов меньше 255, функция checkSum возвращает правильное значение.

например

let bytes1 : [UInt8] = [1, 0xa1]
let validCheck = checkSum(data : bytes1) // 162 = 0xa2
let bytes : [UInt8] = [6, 0xB1, 27,0xc5,0xf5,0x9d]
let invalidCheck = checkSum(data : bytes) // 41

Функция ниже возвращает 41, но ожидаемая контрольная сумма равна 35.

func checkSum(data: [UInt8]) -> UInt8 {

    var sum = 0
    for i in 0..<data.count {
        sum += Int(data[i])
    }
    let retVal = sum & 0xff
    return UInt8(retVal)
}

1 Ответ

0 голосов
/ 01 марта 2019

Ваш checkSum метод в значительной степени прав.Если вы хотите, вы можете упростить это до:

func checkSum(_ values: [UInt8]) -> UInt8 {
    let result = values.reduce(0) { ($0 + UInt32($1)) & 0xff }
    return UInt8(result)
}

Вы указываете на веб-сайт, который сообщает контрольную сумму8 для 06B127c5f59d это 35.

Проблема в том, что в вашеммассив имеет 27, а не 0x27.Если у вас есть шестнадцатеричные значения, вам всегда нужен префикс 0x для каждого значения в литерале массива (или, по крайней мере, если значение больше 9).

Итак, рассмотрим:

let values: [UInt8] = [0x06, 0xB1, 0x27, 0xc5, 0xf5, 0x9d]
let result = checkSum(values)

Это 53.Если вы хотите видеть это в шестнадцатеричном формате (как тот сайт, на который вы ссылались):

let hex = String(result, radix: 16)

Это показывает нам, что контрольная сумма равна 0x35 в шестнадцатеричном.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...