Я пытаюсь преобразовать метод Objective C в Swift, но для этого мне нужна помощь в понимании того, что происходит.
Для контекста входные данные для этого метода начинаются как NSString
, который затем преобразуется в объект NSData
с кодировкой utf8. Затем байты этого объекта данных передаются в метод (параметр message
).
Возвращаемое значение этого метода затем отправляется через writeData
на определенную характеристику CBPeripheral
.
Вот что я понимаю (с точки зрения Swift).
- Переданное сообщение представляет собой массив из
UInt8
байтов:[UInt8]
- 3 переменные создаются как
UInt32
значений;crcVal
,byteVal
иmask
- Затем
crcVal
устанавливается на максимальное значение типаUInt32
- каждый байт из переданного массива
UInt8
байтов затем зацикливается, и выполняется какая-то операция для создания и добавления к конечному результату значенияcrcVal
, которое в конечном итоге используется для отправки через команду CoreBluetoothwriteData
вCBPeripheral
.
Я не очень уверен в побитовых операторах или в том, почему приведенный ниже метод делает то, что делает, поскольку нет документации. Может ли кто-нибудь помочь прояснить некоторые или все части этого? Я надеюсь написать версию этого метода, эквивалентную Swift. Спасибо.
- (uint32_t) computeCRC:(uint8_t *)message len:(NSUInteger)msgLen {
uint32_t crcVal = 0, byteVal, mask;
crcVal = 0xFFFFFFFF;
for (int i=0; i<msgLen; i++) {
byteVal = message[i];
crcVal ^= byteVal;
for (int j=7; j>=0; j--) {
mask = -(crcVal&1);
crcVal = (crcVal>>1)^(0xEDB88320 & mask);
}
}
return ~crcVal;
}