gpt4 book ai didi

swift - 如何在 swift 3 中将 CChar 转换为 Data

转载 作者:搜寻专家 更新时间:2023-11-01 07:14:39 25 4
gpt4 key购买 nike

我在将GBK编码下的CChar更改为Data时遇到了问题。有人能给我一些提示吗,这会有很大帮助语法似乎改变了,所以我对如何去做有点难过

之前改成了NSData,但是语法改成Data了,不知道怎么交换。

let cfEnc = CFStringEncodings.GB_18030_2000
let enc = CFStringConvertEncodingToNSStringENcoding(CFStringEncoding(cfEnc.rawValue))
let ccharStr = "aaa".cString(using: String.Encoding(rawValue: enc))!
let tmp = NSData(bytes: ccharStr, length: ccharStr.count)
self.writeValue(tmp)

现在我变成了

let cfEnc = CFStringEncodings.GB_18030_2000
let enc = CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(cfEnc.rawValue))

let aaa = "aaa\n"
var stringCChar = aaa.cString(using: String.Encoding(rawValue: enc))
let stringData = Data(bytes: &stringCChar, count: (stringCChar?.count)!) // but this exchange can't show the correct result...
self.writeValue(stringData)

谁能帮忙解决这个问题?

最佳答案

问题在

let stringData = Data(bytes: &stringCChar, count: (stringCChar?.count)!)

是您将可选的地址传递给Data构造函数,这意味着读取 struct Optional 的内存内容,而不是字符数据。

所以你必须解包stringCChar,例如可选绑定(bind):

let str = "your String"

let cfEnc = CFStringEncodings.GB_18030_2000
let enc = CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(cfEnc.rawValue))

if let stringCChar = str.cString(using: String.Encoding(rawValue: enc)) {
let stringData = Data(bytes: stringCChar, count: stringCChar.count)
// ...
} else {
// cannot encode string in GB_18030_2000
}

一个稍微简单的解决方案是

let str = "your String"

let cfEnc = CFStringEncodings.GB_18030_2000
let enc = CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(cfEnc.rawValue))

if let stringData = str.data(using: String.Encoding(rawValue: enc)) {
// ....
} else {
// cannot encode string in GB_18030_2000
}

请注意,第一个解决方案将在数据中包含尾随零(C 字符串终止符),而第二个解决方案则不包含。

关于swift - 如何在 swift 3 中将 CChar 转换为 Data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42829318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com