首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将C字符数组转换为字符串

将C字符数组转换为字符串
EN

Stack Overflow用户
提问于 2014-12-13 13:11:33
回答 6查看 16.3K关注 0票数 34

我有一个与C库进行互操作的Swift程序。这个C库返回一个内部有char[]数组的结构,如下所示:

struct record
{
    char name[8];
};

定义已正确导入Swift。但是,该字段被解释为8个Int8元素(类型为(Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8))的元组,我不知道如何使用Swift将其转换为String

没有接受Int8元组的String初始化器,而且似乎不可能获得指向元组的第一个元素的指针(因为类型可以是异构的,这并不奇怪)。

现在,我最好的想法是创建一个小的C函数,它接受指向结构本身的指针,并将name作为char*指针而不是数组返回,并使用该函数。

然而,有没有完全快速的方法呢?

EN

回答 6

Stack Overflow用户

发布于 2014-12-13 14:12:47

实际上,您可以使用Swift的可变参数语法将元组收集到数组中:

let record = getRecord()
let (int8s: Int8...) = myRecord          // int8s is an [Int8]
let uint8s = int8s.map { UInt8($0) }
let string = String(bytes: uint8s, encoding: NSASCIIStringEncoding)
// myString == Optional("12345678")
票数 4
EN

Stack Overflow用户

发布于 2014-12-13 14:59:29

我对自己的目的也很感兴趣,所以我添加了一个新函数:

func asciiCArrayToSwiftString(cString:Int8...) -> String
{
    var swiftString = String()            // The Swift String to be Returned is Intialized to an Empty String
    var workingCharacter:UnicodeScalar = UnicodeScalar(UInt8(cString[0]))
    var count:Int = cString.count

    for var i:Int = 0; i < count; i++
    {
        workingCharacter = UnicodeScalar(UInt8(cString[i])) // Convert the Int8 Character to a Unicode Scalar
        swiftString.append(workingCharacter)             // Append the Unicode Scalar

    }

    return swiftString                     // Return the Swift String
}

我使用以下命令调用此函数:

    let t:Int8 = Int8(116)
    let e:Int8 = Int8(101)
    let s:Int8 = Int8(115)
    let testCString = (t, e, s, t)
    let testSwiftString = wispStringConverter.asciiCArrayToSwiftString(testCString.0, testCString.1, testCString.2, testCString.3)
    println("testSwiftString = \(testSwiftString)")

结果输出为:

testSwiftString =测试

票数 3
EN

Stack Overflow用户

发布于 2017-03-24 02:51:58

我刚刚在使用Swift 3. (3.0.2)时遇到了类似的问题。我试图在Swift中将CChar,CChar的数组转换为字符串。原来Swift 3有一个字符串初始化器,它将接受一个cString。

示例:

let a = "abc".cString(using: .utf8) // type of a is [CChar]
let b = String(cString: a!, encoding: .utf8) // type of b is String
print("a = \(a)")
print("b = \(b)")

结果:

A=可选(97、98、99、0)

B=可选(“abc”)

请注意,字符串上的cString函数会产生一个可选的。当在创建b的String.init函数中使用它时,它必须被强制解包。这意味着两者最终都可能为零,因此也应该使用错误检查。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27455773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档