Быстрое преобразование данных в UnsafeMutablePointer - PullRequest
0 голосов
/ 11 мая 2018

Я вызываю функцию в целевом классе c из swift.

-(char *)decrypt:(char *)crypt el:(int)el{}

при вызове этой функции из swift запрашивает UnsafeMutablePointer<Int8> в качестве значения параметра 'crypt '

значение для ' crypt ' поступает с сервера и является строкой с кодировкой base64.Поэтому я декодировал эту строку и получил объект данных.

let resultData = Data(base64Encoded: base64String)

Теперь мне нужно передать эти данные в вышеупомянутую функцию.Я пытался преобразовать этот объект данных в UnsafeMutablePointer<Int8>

resultData?.withUnsafeBytes { (u8Ptr: UnsafeMutablePointer<Int8>) in
                    let decBytes = tea?.decrypt(u8Ptr , el: el)}

Но он не компилируется.Выдает ошибку ниже

«UnsafeMutablePointer» не конвертируется в «UnsafePointer <_>»

Я не знаю много о цели c.Так может кто-нибудь помочь мне передать этот параметр в функцию c.

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Редактировать, обновить мой ответ для двух вещей:

  • Не возвращает указатель с withUnsafeBytes
  • Учет Swift 5 ', предупреждение об устаревании: ' withUnsafeBytes 'устарело: используйте withUnsafeBytes<R>(_: (UnsafeRawBufferPointer) throws -> R) rethrows -> R вместо
// buffer pointer captured is converted to byte pointer which is used in the block to decode the base64 encoded Data
encodedStringData.withUnsafeMutableBytes { (rawBufferPtr: UnsafeMutableRawBufferPointer) in
    if let rawPtr = rawBufferPtr.baseAddress {
        let decodedString = String(bytesNoCopy: rawPtr, length: rawBufferPtr.count, encoding: .utf8, freeWhenDone: false)
        print(decodedString!)
    }
}

Примечание. Swift 5 не позволяет получить доступ к encodedStringData из блока withUnsafeMutableBytes! Прочитайте Swift 5 Эксклюзивное правоприменение для why.

Захват указателя за пределами блока, видимо, не рекомендуется, он работает, но поведение может стать неопределенным в будущем

Старый ответ:

Это поможет кому-то искать дальнейшие необработанные байты (в представлении UnsafeMutablePointer<UInt8>) объекта Data как переменную для дальнейшего использования (вместо того, чтобы писать все логика в блоке withUnsafeMutableBytes).

var encodedStringData = Data(base64Encoded: "Vmlub2QgaXMgZ3JlYXQh")!

// byte pointer variable used later to decode the base64 encoded Data
let rawPtr: UnsafeMutablePointer<UInt8> = encodedStringData.withUnsafeMutableBytes { (bytePtr: UnsafeMutablePointer<UInt8>) in bytePtr }

let decodedString = String(bytesNoCopy: rawPtr, length: encodedStringData.count, encoding: .utf8, freeWhenDone: false)

print(decodedString, encodedStringData)
0 голосов
/ 11 мая 2018

Вы должны изменить UnsafeMutablePointer на UnsafePointer

UnsafePointer

resultData?.withUnsafeBytes {(bytes: UnsafePointer<CChar>)->Void in
            //Use `bytes` inside this closure

        }

UnsafeMutablePointer

 var data2 = Data(capacity: 1024)
data2.withUnsafeMutableBytes({ (bytes: UnsafeMutablePointer<UInt8>) -> Void in
                 //Use `bytes` inside this closure

            })
...