如何将String转换为UnsafePointer <UInt8>和长度

Che*_*Lin 21 string swift

当我使用NSOutputStreamwrite方法

func write(_ buffer: UnsafePointer<UInt8>, maxLength length: Int) -> Int
Run Code Online (Sandbox Code Playgroud)

我不知道如何转换StringUnsafePointer<UInt8>和长度

我怎么能在swift中做到这一点?

Mar*_*n R 22

您必须先将字符串转换为UTF-8数据

let string = "foo bar"
let data = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
Run Code Online (Sandbox Code Playgroud)

然后将其写入输出流

let outputStream: NSOutputStream = ... // the stream that you want to write to
let bytesWritten = outputStream.write(UnsafePointer(data.bytes), maxLength: data.length)
Run Code Online (Sandbox Code Playgroud)

UnsafePointer()转换是必要的,因为data.bytes有型UnsafePointer<Void>,而不是UnsafePointer<UInt8>如预期的write() 方法.


Swift 3更新:

let string = "foo bar"
// Conversion to UTF-8 data (cannot fail):
let data = string.data(using: String.Encoding.utf8)! 

// Write to output stream:
let outputStream: NSOutputStream = ... // the stream that you want to write to
let bytesWritten = data.withUnsafeBytes { outputStream.write($0, maxLength: data.count) }
Run Code Online (Sandbox Code Playgroud)

  • 简单地说,我有一个类型为`String`的Swift变量.我需要将其转换为`UnsafePointer <UInt8>`. (3认同)

onm*_*133 15

以下是如何在Swift 3中执行此操作.在Swift 4中运行正常

extension String {

  func toPointer() -> UnsafePointer<UInt8>? {
    guard let data = self.data(using: String.Encoding.utf8) else { return nil }

    let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: data.count)
    let stream = OutputStream(toBuffer: buffer, capacity: data.count)

    stream.open()
    data.withUnsafeBytes({ (p: UnsafePointer<UInt8>) -> Void in
      stream.write(p, maxLength: data.count)
    })

    stream.close()

    return UnsafePointer<UInt8>(buffer)
  }
}
Run Code Online (Sandbox Code Playgroud)

要转换StringUnsafeMutablePointer<Int8>

let cString = strdup("Hello") // UnsafeMutablePointer<Int8>
Run Code Online (Sandbox Code Playgroud)

要转换UnsafeMutablePointer<Int8>String

let string = String(cString: cString!) // String
Run Code Online (Sandbox Code Playgroud)


小智 8

斯威夫特 4 ,

将 String 转换为 NSString,然后使用 NSString 的方法。

let text = "Hello"
let pointer: UnsafePointer<Int8>? = NSString(string: text).utf8String
let length = NSString(string: text).length
Run Code Online (Sandbox Code Playgroud)


Lou*_*ell 6

您也可以让 Swift 为您完成!

import Foundation

// Example function:
func printUTF8Vals(_ ptr: UnsafePointer<UInt8>, _ len: Int) { 
    for i in 0..<len { 
        print(ptr[i]) 
    } 
} 

// Call it:
let str = "Hello"
printUTF8Vals(str, str.lengthOfBytes(using: String.Encoding.utf8))

// Prints:
// 72
// 101
// 108
// 108
// 111
Run Code Online (Sandbox Code Playgroud)


小智 5

现在是在Swift 4中工作的人们的答案。您无法再从Data对象获取字节,必须将它们复制到UnsafeMutablePointer中

let helloWorld = "Hello World!"

let data = helloWorld.data(using: String.Encoding.utf8, allowLossyConversion: false)!
var dataMutablePointer = UnsafeMutablePointer<UInt8>.allocate(capacity: data.count)

//Copies the bytes to the Mutable Pointer
data.copyBytes(to: dataMutablePointer, count: data.count)

//Cast to regular UnsafePointer
let dataPointer = UnsafePointer<UInt8>(dataMutablePointer)

//Your stream
oStream.write(dataPointer, maxLength: data.count)
Run Code Online (Sandbox Code Playgroud)


abd*_*lek 5

这是Swift 5的字符串扩展,您可以将字符串转换为UnsafePointer<UInt8>UnsafeMutablePointer<Int8>

extension String {
    func toUnsafePointer() -> UnsafePointer<UInt8>? {
        guard let data = self.data(using: .utf8) else {
            return nil
        }

        let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: data.count)
        let stream = OutputStream(toBuffer: buffer, capacity: data.count)
        stream.open()
        let value = data.withUnsafeBytes {
            $0.baseAddress?.assumingMemoryBound(to: UInt8.self)
        }
        guard let val = value else {
            return nil
        }
        stream.write(val, maxLength: data.count)
        stream.close()

        return UnsafePointer<UInt8>(buffer)
    }

    func toUnsafeMutablePointer() -> UnsafeMutablePointer<Int8>? {
        return strdup(self)
    }
}
Run Code Online (Sandbox Code Playgroud)

转换UnsafeMutablePointer<Int8>String

guard let mutablePointer = "test".toUnsafeMutablePointer() else {
    return
}

let str = String(cString: mutablePointer)
Run Code Online (Sandbox Code Playgroud)