Ваш 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
в шестнадцатеричном.