Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在跨iOS版本填充数据时,数据构造函数具有不同的语义_Ios_Swift_Nsdata - Fatal编程技术网

在跨iOS版本填充数据时,数据构造函数具有不同的语义

在跨iOS版本填充数据时,数据构造函数具有不同的语义,ios,swift,nsdata,Ios,Swift,Nsdata,以下是我的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 哪个是“你好,世界”的正确

以下是我的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
哪个是“你好,世界”的正确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
之后的某个地方插入了零终止符