当前位置: 首页 > 面试题库 >

将字符串转换为int8数组

东门宜
2023-03-14
问题内容

我有一个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)))
}

在该块内部,$0是一个指向元组的(可变)指针。该指针UnsafeMutablePointer<Int8>将按BSD库函数的strlcpy()预期
转换为。

它还使用了这样的事实:Swift字符串productName会自动UnsafePointer<UInt8> 按照 UnsafePointer<UInt8> 函数参数行为的字符串值中的说明进行操作。如该html" target="_blank">线程的注释中所述,这是通过创建一个临时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))
    }
}


 类似资料:
  • 问题内容: 从字符串转换为字符串的最佳方法(最快的性能)是什么? 对于我们可以做,但它给出了一个错误: 我从那产生的from 方法而不是 这个解决方案最快吗? 编辑 我的坏东西,而不是..,所以我可以直接做。 问题答案: 事先注意: 询问者首先指出输入分片就是答案。后来他意识到输入是可以直接转换为的,因为它是别名(并且语言规范支持=> 转换)。 您无法转换不同类型的切片,必须手动进行。 问题是我们

  • 我正在使用Schembuf在带有套接字的计算机之间更改数据。要传输数据,我使用以下内容: 然而,我注意到Protobuf无法读取任何非int类型的接收数据(它将其分配给0)。果不其然,如果我不使用套接字,但试图用相同的代码片段返回消息,则会发生相同的情况: 我还指出: 那么,为什么我不能正确地将数据转换回字符串呢?如果这是一个参考问题,为什么protobuf不能读取字符数组数据或从字符数组转换的字

  • 我有一个购物车php页面,在那里我显示客户端产品。在同一页中,我有一个表单,可以将客户的个人详细信息(如姓名、姓氏等)以及产品信息(如产品名称、数量等)直接发送到我的电子邮件地址。 现在,问题是,当我发送表单时,在我的电子邮件地址上,我收到了所有的信息,但没有产品细节,例如在订单电子邮件中的产品名称字段,我有ARRAY。 我看到将数组转换为字符串时出现问题,但我不知道如何转换,我尝试了几个示例,但

  • 问题内容: 我想将数组转换为。例如字符串数组是这样的: 如何将此String数组转换为ArrayList? 问题答案: 为此使用此代码,

  • 问题内容: 我有两个字符串数组键和值 将它们转换为地图的最快方法是什么?我知道我们可以遍历它们。但是,这里有实用程序吗? 问题答案: 比这快吗?

  • 问题内容: 我想问一个有关将a转换为on的问题。这是我从服务器获取的代码。 这就是。 我怎样才能将我拥有的jsonArray转换为StringArray,这样我就可以得到StringArray: 谢谢您的帮助 :) 问题答案: 看一下本教程。您也可以像上面这样解析json: