Причиной сбоя является следующее выражение:
bytes : UnsafePointer<[UInt]>
Предполагается, что данные представляют собой последовательность UInt.Таким образом, указатель на начало данных не так опасен, как указатель на [UInt]
, массив UInt;это небезопасный указатель на UInt, т. е. первый в ряду.Вы должны сказать:
bytes : UnsafePointer<UInt>
Вот вам и авария.Теперь давайте поговорим о том, что вы в основном пытаетесь сделать здесь.
Я не уверен, что должен делать формат строки, но я понимаю, что идея ntohl
состоит в том, чтобы гарантировать порядковый номернекоторые длинные C длиной (32 бита).Поэтому я опущу часть строкового формата и просто расскажу о том, как вы могли бы принять поток C long int, полученный в Data, и обратить вспять порядковый номер long int.
Предположим, d
является изменяемым Data(то есть объявлено с var
).Затем, предполагая, что это представляет последовательность значений с прямым порядком байтов UInt32, и вы хотите преобразовать их в значения с прямым порядком байтов, вы скажете:
let ct = d.count/4
d.withUnsafeMutableBytes{
(ptr:UnsafeMutablePointer<UInt32>) in
for ix in 0..<ct {
ptr[ix] = ptr[ix].bigEndian
}
}