执行原始串行通信时将C#转换为swift:LRC

时间:2019-04-18 13:05:12

标签: swift serial-port

对于我现有的C#代码,我需要等效的Swift 4.2代码。 我有一个与Verifone读卡器通信的C#应用​​程序。 我总是在每条LRC指令后附加一个BYTE。 我包括我的C#代码。 (请注意,它具有XOR操作)

这是重置Verifone(十六进制)的示例指令

0237320306转换为STX-3732-ETX-LRC

计算LRC。 ,您可以在STX和LRC之间发送所有内容-> 373203 答案当然是06

//这是有效的C#代码

private string GetChecksum(string s)
  {
    int checksum = 0;
    foreach (char c in GetStringFromHex(s))
      {
         checksum ^= Convert.ToByte(c);
      }
      return checksum.ToString("X2");
 } 
private string GetStringFromHex(string s)
 {
   string result = "";
   string s2 = s.Replace(" ", "");
   for (int i = 0; i < s2.Length; i += 2)
     {
       result += Convert.ToChar(int.Parse(s2.Substring(i, 2),   System.Globalization.NumberStyles.HexNumber));
     }
     return result;
}

////我找到了一些有关目标C的代码,但我不知道它是否有效,而且我真的是苹果世界的新手,所以我想坚持使用SWIFT

Calculate LRC in Objective c

请帮助我在Swift 4.2中编写此代码

1 个答案:

答案 0 :(得分:0)

这似乎有效。但是需要进行一些严格的测试。.

var str = computeLRC(hexString:"373203")
print(str)

//返回06

'''

func computeLRC (hexString: String ) -> String {
    var checksum : UInt16 = 0
    var my = ""
    for i in stride(from: 0, to: hexString.count, by: 2) {

        let indexStartOfText = hexString.index( hexString.startIndex, offsetBy: i)
        let indexEndOfText = hexString.index( indexStartOfText, offsetBy: 2)
        let substring3 = hexString[indexStartOfText..<indexEndOfText]

        let intResult =  Int(String(substring3) , radix: 16)
        guard let myUnicodeScalar = UnicodeScalar(intResult!) else {
            return ""
        }
        // convert UnicodeScalar to Character
        let myCharacter = Character(myUnicodeScalar)

        my += String(myCharacter)
    }

    for myChar in my {
        var byte: UInt16 = Array(String(myChar).utf16)[0]
        checksum ^= byte
    }

    return String(format:"%02X", checksum)

}

'''