下面是我拥有的poc代码:
let text = "Hello, World"
let data = text.data(using: .utf8)! as CFData
let newData = Data(data as NSData)
print(newData.base64EncodedString())
return true
当我在运行iOS 13或14的设备中运行该操作时,会得到以下输出:
SGVsbG8sIFdvcmxk
这是“Hello,World”的正确base64。然而,当我在iOS 12中运行完全相同的代码时,我会得到以下结果:
SAAAAAAAAAAMAAAA
这在文本(utf-8)格式中是毫无意义的,但它的十六进制是:
48 00 00 00 00 00 00 00 0c 00 00 00
所以我不确定这里发生了什么,即使它只是填零,为什么它不是一直都是零?虽然我知道我所做的是错误的,但下面的工作在所有版本上都是完美的:
print((data as Data).base64EncodedString())
我只是好奇为什么它在版本上的表现不同。文档似乎没有提到旧版本中的任何特定行为警告。
请停止处理cfdata
和nsdata
在Swift中,将字符串
转换为数据
的推荐API是
let text = "Hello, World"
let data = Data(text.utf8)
print(data.base64EncodedString())
它在所有版本中都能可靠地工作,并且避免了可选的。
问题是不必要的cf-ns
桥接。似乎在h
后面某处插入了一个零终止符。