Разобрался.
Согласно документации String(cString: fooParam)
- Параметр cString: указатель на кодовую последовательность UTF-8 с нулевым символом в конце.
Если данные, которые вы отправляете, не заканчиваются нулем, этот инициализатор не будет знать, где заканчиваются данные указателя, и будет иметь «неожиданное поведение», иногда терпящее неудачу, иногда успешное.
Решение заключается в том, что если данные, которые вы пытаетесь передать, не заканчиваются нулем, добавить в них нулевой терминатор.
Например:
let pointer = UnsafeMutableRawPointer.allocate(byteCount: 5, alignment: 1)
pointer.storeBytes(of: 77, as: UInt8.self)
pointer.advanced(by: 1).storeBytes(of: 105, as: UInt8.self)
(pointer+2).storeBytes(of: 107, as: UInt8.self)
(pointer+3).storeBytes(of: 101, as: UInt8.self)
(pointer+4).storeBytes(of: 0, as: UInt8.self)
let typedPointer = pointer.bindMemory(to: UInt8.self, capacity: 5)
let readableData = String(cString: typedPointer)
В случае того, что я на самом деле делал, у меня не было необработанной ссылки, а была напечатана. То же самое было достигнуто с помощью
somePointer.advanced(by: 4).pointee = 0