ios - 跨 iOS 版本填充数据时,数据构造函数具有不同的语义
问题描述
这是我的 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
String
在 Swift 中,推荐的将 a 转换为的 APIData
是
let text = "Hello, World"
let data = Data(text.utf8)
print(data.base64EncodedString())
它在所有版本中都可靠地工作,并且避免了可选的。
问题是不必要的CF - NS
桥接。似乎在H
某处之后插入了一个零终止符。
推荐阅读
- swift - 同一元素的 SwiftUI 多个动画
- angular - 角度滑动器幻灯片不捕捉
- android - NestedScrollView 内的嵌套 Recyclerview 中的辅助功能遍历顺序错误
- java - 使用 do-while 和 ArrayList 时遇到问题
- reactjs - ReactDOM.render 追加而不是替换
- r - 如何一次更改整个脚本中的响应变量?
- ios - 如何保持您的 iOS 应用程序的干净生产版本?
- javascript - 如何在浏览器控制台中从 pastebin 或 JS 文件运行代码?
- prometheus - 计算 Prometheus 卷大小以存储指标
- reactjs - 如何使用反应导航 5 导航其他屏幕