我有一个应用程序,使用相机读取药物的数据矩阵条形码。
当它对一个特定的药物,我收到这个字符串从检测器,如在Xcode控制台看到的:
0100000000D272671721123110700XXXXU0000001d91D1
我的问题是U0000001d91D1
部分。
该代码可以按如下方式分解:
01 00000000D27267 17 211231 10 700XXXX U0000001d 91D1"
01 = drug code
17 = expiring date DMY
10 = batch number
The last part is the dosage rate
现在在应用程序的另一部分,我在模拟器上,没有相机,所以我需要将这个字符串传递给分解代码的模块。
我尝试使用
将代码存储为字符串let code = "0100000000D272671721123110700XXXXU0000001d91D1"
它抱怨倒条,所以我把它改成双条
let code = "0100000000D272671721123110700XXXX\U0000001d91D1"
检测器分析该字符串,得出批号是700XXXXU0000001d91D1
,而不是700XXXX
,因此以后包含的信息丢失了。
我想这是unicode之类的。
如何正确创建这个字符串
您可以使用字符串转换来解码十六进制unicode字符:
let str1 = #"0100000000D272671721123110700XXXXU00000DF491D1"#
let str2 = #"0100000000D272671721123110700XXXXU0000001d91D1"#
let decoded1 = str1.applyingTransform(.init("Hex-Any"), reverse: false)! // "0100000000D272671721123110700XXXX෴91D1"
let decoded2 = str2.applyingTransform(.init("Hex-Any"), reverse: false)! // "0100000000D272671721123110700XXXX91D1"
您还可以摆脱扩展StringTransform
和StringProtocol
的冗长:
extension StringTransform {
static let hexToAny: Self = .init("Hex-Any")
static let anyToHex: Self = .init("Any-Hex")
}
extension StringProtocol {
var decodingHex: String {
applyingTransform(.hexToAny, reverse: false)!
}
var encodingHex: String {
applyingTransform(.anyToHex, reverse: false)!
}
}
用法:
let str1 = #"0100000000D272671721123110700XXXXU00000DF491D1"#
let str2 = #"0100000000D272671721123110700XXXXU0000001d91D1"#
let decoded1 = str1.decodingHex // "0100000000D272671721123110700XXXX෴91D1"
let decoded2 = str2.decodingHex // "0100000000D272671721123110700XXXX91D1"
U0000001d
子字符串可能表示代码点U+001D INFORMATION SEPARATOR THREE,这也是ASCII码点GS(组分隔符)。
在Swift字符串字面值中,我们可以使用Unicode转义序列:u{1d}
来编写该代码点。试着这样写你的字符串字面值:
let code = "0100000000D272671721123110700XXXXu{1d}91D1"