我在Swift 4中有以下功能:
import Foundation
func crc16(of data: Data) -> String {
var crc = 0xffff as UInt16
for byte in data {
crc = crc ^ UInt16(byte)
for _ in 0..<8 {
if crc & 0x0001 == 0x0001 {
crc = (crc >> 1) ^ 0xa001
} else {
crc = crc >> 1
}
}
}
let msb = crc >> 8
let lsb = crc & 0x00ff
return String(format: "%02x%02x", lsb, msb)
}
我可以用该代码计算CRC:
print(crc16(of: Data(bytes: [0x11, 0x01, 0x00, 0x03, 0x00, 0x0C]))) // -> ce9f
现在我问,如何修改该函数以使用该代码:
print(crc16("11010003000C")) // -> ce9f
而不是:
print(crc16(of: Data(bytes: [0x11,0x01,0x00,0x03,0x00,0x0C]))) // -> ce9f
因为我想创建一个简单的应用程序,我想要在EditText中插入字符串“11010003000C”,而在另一个editText中显示函数“ce9f”的结果。
提前致谢!!
答案 0 :(得分:0)
您可以编写另一个版本的crc16
,其中包含一个String作为输入。然后它将此字符串拆分为每个2个字符的子字符串,并将它们作为字节附加到数据结构中:
func crc16(_ str: String) -> String {
var data = Data()
var startIndex = str.startIndex
while startIndex < str.endIndex {
let endIndex = str.index(startIndex, offsetBy: 2)
let substr = str[startIndex..<endIndex]
data.append(UInt8(substr, radix: 16)!)
startIndex = endIndex
}
return crc16(of: data)
}