我必须转换字节的字符串为Modbus calc

时间:2017-11-09 10:00:21

标签: string hex swift4 modbus crc16

我在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”的结果。

提前致谢!!

1 个答案:

答案 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)
}