gpt4 book ai didi

swift - 快速调用 NSMutableData 上的 map

转载 作者:行者123 更新时间:2023-11-28 05:38:13 24 4
gpt4 key购买 nike

我无法解释 NSMutableData 的一些奇怪行为。我有一个方法可以将字符串转换为以 null 结尾的 UTF-8 字节数组。但是,如果我然后使用“data.map(...)”将其打印出来,第一个字节是正确的,其余的看起来像随机内存。奇怪的是,如果我用“let copy = data.copy() as!Data”制作一个副本,然后使用“copy.map(...)”它就可以正常工作。我正在转换为 NSMutableData 而不是 Data,因为这是我正在使用的 API 接受的格式。

下面是将字符串转换为 NSMutableData 中的 UTF-8 字节数组的代码:

public func getUtf8Bytes(of str: String) -> NSMutableData {
// Convert to a null-terminated UTF-8 NSMutableData
let utf8CStringInts: [UInt8] = str.utf8CString.map { UInt8($0) }
let count = utf8CStringInts.count
let data = NSMutableData(length: count)!
data.resetBytes(in: NSRange(location: 0, length: count))

// Copy into NSMutableData
let pointer = data.mutableBytes
var index = 0
for byte in utf8CStringInts {
pointer.storeBytes(of: byte, toByteOffset: index, as: UInt8.self)
index += 1
}

return data
}

以下将正确打印“UTF-8 字节:0x31 0x32 0x33 0x00”:

let utf8Data = getUtf8Bytes(of: "123")
let debugString = (utf8Data.copy() as! Data).map { String(format: "0x%02x ", $0) }.joined()
print("UTF-8 Bytes: " + debugString)

但是,如果我按如下方式取出副本,它将错误地打印“0x31 0x00 0x00 0x00”:

let utf8Data = getUtf8Bytes(of: "123")
let debugString = utf8Data.map { String(format: "0x%02x ", $0) }.joined()
print("UTF-8 Bytes: " + debugString)

谁能解释为什么将结果复制到数据后打印正确?

最佳答案

很有趣...所以在四处搜寻之后,这就是我的发现。

复制 NSMutableData 不是解决方案,而是将其桥接到Data。这也适用:

let utf8Data = getUtf8Bytes(of: "123")
let debugString = (mutableData as Data).map { String(format: "0x%02x ", $0) }.joined()
print("UTF-8 Bytes: \(debugString)")

但是为什么?问题似乎源于 NSDataDataProtocol 的遵从性(及其随后对 Collection 协议(protocol)的隐式继承)。正是通过这种隐式继承链,才允许(误)使用这些通用的 Collection 方法(例如下标访问、mapforEach 等.) 都是“损坏”。

此外,我们可以验证 NSMutableData 的字节内容是否正确:

print((0..<mutableData.length)
.map({ String(format: "0x%02x ", mutableData.bytes.load(fromByteOffset: $0, as: UInt8.self)) })
.joined())
// Prints "0x31 0x32 0x33 0x00"

此外,还有一种更快捷的方法来实现 getUtf8Bytes(of:):

public func getUtf8Bytes(of str: String) -> NSMutableData {
// Note: You may want to handle the force unwrapping here in a safer way...
return NSMutableData(data: (str + "\0").data(using: .utf8)!)
}

关于swift - 快速调用 NSMutableData 上的 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57861024/

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