对于我现有的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
请帮助我在Swift 4.2中编写此代码
答案 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)
}
'''