【问题标题】:Swift String to bytes in a bufferSwift字符串到缓冲区中的字节
【发布时间】:2018-11-24 02:47:27
【问题描述】:

我有一个只包含 ASCII 字符的 swift 字符串。我必须将它们放在一个 char* 缓冲区中,然后将其转换为 void* 并反向执行此过程以获取回复的字符串。

例子:

bool query(const void* queryString, byte queryLength, void* replyBuffer, byte bufferLength);

所以,我必须设置两个缓冲区。一个将保存我的查询字符串,一个 180 字节大,用于包含回复。

如何设置这两个缓冲区并来回复制字符串?我尝试探索 _bridgeToObjectiveC().utf8String 和 unsafemutablepointer...但我感到迷茫...

【问题讨论】:

    标签: swift unsafe-pointers


    【解决方案1】:

    您可以这样设置缓冲区并将它们传递给 C 函数:

    let queryString = "Query ..."
    
    let queryBuffer = Array(queryString.utf8)
    var replyBuffer = Array(repeating: UInt8(0), count: 180)
    
    let result = query(queryBuffer, numericCast(queryBuffer.count), &replyBuffer, numericCast(replyBuffer.count))
    

    queryBuffer 是一个字符串的 UTF-8 表示形式的数组, 和replyBuffer 一个包含指定数量的零字节的数组。

    数组分别用queryBuffer&replyBuffer传递给函数,传递指向元素存储的指针 到 C 函数。

    如果结果缓冲区在返回时填充了以 null 结尾的 C 字符串 然后你可以用

    创建一个Swift字符串
    let resultString = String(cString: replyBuffer)
    

    【讨论】:

    • 感谢您的回复。 &Array(repeating: UInt8(0), count: 180)let receiveBuffer = UnsafeMutablePointer<UInt8>.allocate(capacity: 256) receiveBuffer.initialize(repeating: 0, count: 256) 有什么区别?
    • Array(...) 创建局部数组变量,在离开当前作用域时自动释放。你也可以使用UnsafeMutablePointer<UInt8>.allocate(...),它分配内存,所以你必须记住最终释放它,否则你有内存泄漏。
    猜你喜欢
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多