string - 将字符串转换为 int8 数组

标签 string swift

我有一个包含 C 字符串的 C 结构(旧库,等等等等),现在我需要将 CFString 和 Swift 字符串转换成这个 C 字符串。有点像

struct Product{
   char name[50];
   char code[20];
}

所以我试图将其分配为

productName.getCString(&myVarOfStructProduct.name, maxLength: 50, encoding: NSUTF8StringEncoding)

但是编译器给我以下错误:无法将类型 (int8, int8, int8....) 转换为 [CChar]。

最佳答案

可能的解决方案:

withUnsafeMutablePointer(&myVarOfStructProduct.name) {
    strlcpy(UnsafeMutablePointer($0), productName, UInt(sizeofValue(myVarOfStructProduct.name)))
}

在 block 内,$0是指向元组的(可变)指针。这个指针是 转换为 UnsafeMutablePointer<Int8>正如预期的那样 BSD library function strlcpy() .

它还利用了 Swift 字符串 productName 的事实是自动的 至 UnsafePointer<UInt8>String value to UnsafePointer<UInt8> function parameter behavior 中所述.正如评论中提到的那样 线程,这是通过创建一个临时的 UInt8 来完成的数组(或序列?)。 因此,或者您可以显式枚举 UTF-8 字节并将它们放入 进入目的地:

withUnsafeMutablePointer(&myVarOfStructProduct.name) {
    tuplePtr -> Void in
    var uint8Ptr = UnsafeMutablePointer<UInt8>(tuplePtr)
    let size = sizeofValue(myVarOfStructProduct.name)
    var idx = 0
    if size == 0 { return } // C array has zero length.
    for u in productName.utf8 {
        if idx == size - 1 { break }
        uint8Ptr[idx++] = u
    }
    uint8Ptr[idx] = 0 // NUL-terminate the C string in the array.
}

另一种可能的解决方案(使用中间 NSData 对象):

withUnsafeMutablePointer(&myVarOfStructProduct.name) {
    tuplePtr -> Void in
    let tmp = productName + String(UnicodeScalar(0)) // Add NUL-termination
    let data = tmp.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!
    data.getBytes(tuplePtr, length: sizeofValue(myVarOfStructProduct.name))
}

Swift 3 更新:

withUnsafeMutablePointer(to: &myVarOfStructProduct.name) {
    $0.withMemoryRebound(to: Int8.self, capacity: MemoryLayout.size(ofValue: myVarOfStructProduct.name)) {
        _ = strlcpy($0, productName, MemoryLayout.size(ofValue: myVarOfStructProduct.name))
    }
}

关于string - 将字符串转换为 int8 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27461904/

相关文章:

java - 使用二进制编码将 byte[] 转换为 String

arrays - 如何将 int 数组转换为字符串数组

ios - 如何从后台调用locationManager didUpdateToLocation?

ios - 在另一个类中滑动手势识别器

swift - 函数返回 Swift 后赋值

ios - 来自 Calendar.dateComponents 的日期在 Swift 中返回 nil

c++ - const char 和二进制运算符错误

javascript - String.normalize() 的意义何在?

mysql - 如何使用 concat 压缩多行

ios - 通过 tableview 中的按钮进行 segue 执行 2 个 segues 而不是一个