跨 iOS 个版本填充数据时,数据构造函数具有不同的语义
Data constructor has different semantics when populating data across iOS versions
这是我的 poc 代码:
let text = "Hello, World"
let data = text.data(using: .utf8)! as CFData
let newData = Data(data as NSData)
print(newData.base64EncodedString())
return true
当我 运行 在设备 运行ning 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 中,将 String
转换为 Data
的推荐 API 是
let text = "Hello, World"
let data = Data(text.utf8)
print(data.base64EncodedString())
它在所有版本中都可靠地工作,并且避免了可选的。
问题是不必要的 CF - NS
桥接。似乎在 H
之后的某处插入了一个零终止符。
这是我的 poc 代码:
let text = "Hello, World"
let data = text.data(using: .utf8)! as CFData
let newData = Data(data as NSData)
print(newData.base64EncodedString())
return true
当我 运行 在设备 运行ning 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 中,将 String
转换为 Data
的推荐 API 是
let text = "Hello, World"
let data = Data(text.utf8)
print(data.base64EncodedString())
它在所有版本中都可靠地工作,并且避免了可选的。
问题是不必要的 CF - NS
桥接。似乎在 H
之后的某处插入了一个零终止符。