gpt4 book ai didi

Swift Data.subdata 因 EXC_BAD_INSTRUCTION 而失败(代码=EXC_I386_INVOP,子代码=0x0)

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

我正在尝试从 Data 对象中检索数据的子集。当我尝试使用 subdata(in:) 获取数据时,出现上述错误。我无法弄清楚我做错了什么,因为所有值看起来都是正确的。有问题的代码是:

let tempData = incomingDataBuffer.subdata(in: 0..<headerSizeInBytes)

使用我调查过的 lldb,发现一切看起来都是正确的。

(lldb) po incomingDataBuffer.count
8

(lldb) po headerSizeInBytes
6

(lldb) po incomingDataBuffer
▿ 8 bytes
- count : 8
▿ pointer : 0x0000600000002a42
- pointerValue : 105553116277314
▿ bytes : 8 elements
- 0 : 17
- 1 : 6
- 2 : 29
- 3 : 49
- 4 : 2
- 5 : 0
- 6 : 1
- 7 : 6

(lldb) po incomingDataBuffer.subdata(in: 0..<headerSizeInBytes)
error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
The process has been returned to the state before expression evaluation.

这对我来说没有任何意义。所有的值看起来都是正确的。没有什么是零。为什么我会失败?感谢帮助。 :)

最佳答案

Data 值(或一般集合)的索引不一定从零开始。 slice 与原始数据共享索引。示例:

let buffer = Data(bytes: [1, 2, 3, 4, 5, 6])[2..<4]

print(buffer.count) // 2
print(buffer.indices) // 2..<4

let tmpData = buffer.subdata(in: 0..<2)
// 💣 Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

因此您必须考虑起始索引:

let tmpData = buffer[buffer.startIndex ..< buffer.startIndex + 2]
print(tmpData as NSData) // <0304>

或者简单地使用前缀:

let tmpData = buffer.prefix(2)
print(tmpData as NSData) // <0304>

适用于您的情况:

let tempData = incomingDataBuffer.prefix(headerSizeInBytes)

关于Swift Data.subdata 因 EXC_BAD_INSTRUCTION 而失败(代码=EXC_I386_INVOP,子代码=0x0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54698947/

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