在Swift中使用C样式的unsigned char数组和按位运算符

 娟儿2502923263 发布于 2023-01-11 16:07

我正在努力将一些Objective-C代码更改为Swift,我无法弄清楚如何在这个特定的代码实例中处理unsigned char数组和按位运算.

具体来说,我正在努力将以下Objective-C代码(处理CoreBluetooth)转换为Swift:

unsigned char advertisementBytes[21] = {0};
[self.proximityUUID getUUIDBytes:(unsigned char *)&advertisementBytes];
advertisementBytes[16] = (unsigned char)(self.major >> 8);
advertisementBytes[17] = (unsigned char)(self.major & 255);

我在Swift中尝试了以下内容:

var advertisementBytes: CMutablePointer
self.proximityUUID.getUUIDBytes(advertisementBytes)
advertisementBytes[16] = (CUnsignedChar)(self.major >> 8)

我遇到的问题是Swift中的getUUIDBytes似乎只是将一个CMutablePointer对象作为一个参数,而不是一个CUnsignedChars数组,所以我不知道如何对adsBytes进行后续的按位操作,因为它似乎需要要成为unsignedChar数组.

另外,CMutablePointer抛出一个错误,说Swift中的CMutablePointers不支持固定长度数组.

有人可以就潜在的解决方案或解决方案提出建议吗?非常感谢.

1 个回答
  • 看看与C API交互

    主要是这个

    C可变指针

    当函数声明为接受CMutablePointer参数时,它可以接受以下任何一个:

    nil,作为空指针传递

    CMutablePointer值

    一个输入输出表达式,其操作数是类型为Type的存储左值,它作为左值的地址传递

    in-out Type []值,作为指向数组开头的指针传递,并在调用期间延长生命周期

    如果你声明了这样一个函数:

    迅速

    func takesAMutablePointer(x: CMutablePointer<Float>) { /*...*/ } You
    

    可以通过以下任何一种方式调用它:

    迅速

    var x: Float = 0.0 
    var p: CMutablePointer<Float> = nil 
    var a: Float[] = [1.0, 2.0, 3.0] 
    takesAMutablePointer(nil) 
    takesAMutablePointer(p) 
    takesAMutablePointer(&x) 
    takesAMutablePointer(&a)
    

    所以你的代码变成了

    var advertisementBytes = CUnsignedChar[]()
    self.proximityUUID.getUUIDBytes(&advertisementBytes)
    advertisementBytes[16] = CUnsignedChar(self.major >> 8)
    

    2023-01-11 16:10 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有