gpt4 book ai didi

objective-c - 如何使用按位运算符将带有 NSData 字节的 Obj-C 方法转换为 Swift

转载 作者:搜寻专家 更新时间:2023-11-01 06:01:01 24 4
gpt4 key购买 nike

我正在尝试将 Objective C 方法转换为 Swift,但为了做到这一点,我需要一些帮助来了解发生了什么。

对于上下文,此方法的输入以 NSString 开始,然后转换为具有 utf8 编码的 NSData 对象。然后将此数据对象的字节传递给方法(message 参数)。

此方法的返回值然后通过 writeData 发送到 CBPeripheral 的某个特征。

这是我的理解(从 Swift 的角度来看)。

  • 传入的消息是一个UInt8字节数组:[UInt8]
  • 3 个变量被创建为 UInt32 值; crcValbyteValmask
  • crcVal 然后设置为 UInt32 类型的最大值
  • UInt8 字节数组中传入的每个字节然后循环遍历并执行某种操作以生成并附加到 crcVal 值的最终结果,该值最终用于通过 CoreBluetooth 的 writeData 命令发送到 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;
}

最佳答案

与其从头开始编写实现,不如使用 crc32 的 zlib 实现?:

import zlib

func crc32(from data: Data) -> UInt {
return data.withUnsafeBytes { (buffer: UnsafePointer<Bytef>) -> UInt in
return zlib.crc32(0, buffer, uInt(data.count))
}
}

但是,为了帮助您理解位运算:

func computeCRC(message: [UInt8]) -> UInt32 {
var crc: UInt32 = 0xFFFFFFFF

for byte in message {
crc ^= UInt32(byte)
for _ in 0 ..< 8 {
// negation using 2-complement: -x = ~x + 1
// use &+ addition with overflow
let mask = ~(crc & 1) &+ 1
crc = (crc >> 1) ^ (0xEDB88320 & mask)
}
}

return ~crc
}

请注意,我们不需要在 Swift 中传递字节数。这些实现具有不同的签名并返回略有不同的类型,但它们都给出相同的结果。

关于objective-c - 如何使用按位运算符将带有 NSData 字节的 Obj-C 方法转换为 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50649035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com