加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在Swift中使用位操作?

发布时间:2020-12-14 04:57:02 所属栏目:百科 来源:网络整理
导读:我需要形成一个20字节的数据包,并通过蓝牙将有效载荷发送到硬件外设. 这个20字节的数据包在内部分为14个数据集,每个11位,最后6位应为空字符. 因此,总计:160位(20字节)= 14(集)* 11(位)6(空字符) 11位再次分为3组,每组2位,3位和6位.然而,对于主要问题并不重
我需要形成一个20字节的数据包,并通过蓝牙将有效载荷发送到硬件外设.

这个20字节的数据包在内部分为14个数据集,每个11位,最后6位应为空字符.

因此,总计:160位(20字节)= 14(集)* 11(位)6(空字符)

11位再次分为3组,每组2位,3位和6位.然而,对于主要问题并不重要,我目前能够通过采用’Int16’来形成11位.我知道,我将进行移位操作以过滤11位.

如果我只有一个数据集,那么我应该填充除了带有空字符的前11位之外的所有20个字节,如果两个数据集除了22位之外的所有数据都应该分别为空字符.

我面临的问题是形成这个顺序160位,因为奇数位是11.我想采取’Int’并做移位(<<<)操作然后做按位OR(|)但是一个Int是64位. 目前我认为采用20的固定大小的字符数组将适合这种情况.虽然从概念上来说我认为这是最好的方式,但从程序上来说,我无法形成具有实现这一目标的所有条件的逻辑.我想我需要将所有逻辑放在一个循环中. 任何人都可以告诉它是实现这一目标的正确方法,并指导我解决它,如果这是最好的方法.或者指出任何其他方式(如果可用).

解决方法

您不需要将所有数据集打包到20字节数组中,直到最后,因此将它们保存在长度为14的Int数组中.更容易使用这种方式.当您需要将其发送到硬件时,将其转换为长度为20的UInt8数组:

struct DataPacket {
    var dataSets = [Int](count: 14,repeatedValue: 0)

    func toCArray() -> [UInt8] {
        var result = [UInt8](count: 20,repeatedValue: 0)
        var index = 0
        var bitsRemaining = 8
        var offset = 0

        for value in self.dataSets {
            offset = 10

            while offset >= 0 {
                let mask = 1 << offset
                let bit = ((value & mask) >> offset) << (bitsRemaining - 1)
                result[index] |= UInt8(bit)

                offset -= 1
                bitsRemaining -= 1
                if bitsRemaining == 0 {
                    index += 1
                    bitsRemaining = 8
                }
            }
        }

        return result
    }
}

// Usage:
var packet = DataPacket()
packet.dataSets[0] = 0b22222222221
packet.dataSets[1] = 0b00000000011
// etc...

let arr = packet.toCArray()

有很多转移操作正在进行,所以我无法解释所有这些.通常的理想是将这些11位数据集中的每一个分配为字节,并根据需要扩展到下一个字节.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读