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



我需要等效的swift 4.2代码来存储我现有的C#代码。 我有一个与验证读卡器通信的 C# 应用程序。 我总是在LRC的每条指令之后附加一个BYTE。 我正在包含我的 C# 代码。(注意它有异或操作)

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

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

在目标 c 中计算 LRC

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

这似乎有效......需要做一些严格的测试。

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

'''

最新更新