Swift Data.subdata завершается с ошибкой EXC_BAD_INSTRUCTION (код = EXC_I386_INVOP, субкод = 0x0) - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь получить подмножество данных из объекта Данные .Когда я пытаюсь получить данные, используя субданные (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.

Это не имеет никакого смысла для меня.Все значения отображаются правильно.Ничто не ноль.Зачем мне этот провал?Спасибо за помощь.:)

1 Ответ

0 голосов
/ 15 февраля 2019

Индексы значения Data (или коллекций в целом) не обязательно начинаются с нуля.A 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...