Ram*_*sad 5 bit-manipulation swift
我需要形成一个20字节的数据包,并通过蓝牙将有效载荷发送到硬件外设.
这个20字节的数据包在内部分为14个数据集,每个11位,最后6位应为空字符.
因此,总计: 160位(20字节)= 14(集)*11(位)+6(空字符)
11位再次分为3组,每组2位,3位和6位.然而,对于主要问题并不重要,我目前能够通过采用'Int16'来形成11位.我知道,我将进行移位操作以过滤11位.
如果我只有一个数据集,那么我应该填充除了带有空字符的前11位之外的所有20个字节,如果两个数据集除了22位之外的所有数据都应该分别为空字符.
我面临的问题是形成这个顺序的160位,因为奇数位是11.我想采取'Int'并执行shift(<<)操作然后按位OR(|)但是Int是64位.
目前我认为采用20的固定大小的字符数组将适合这种情况.虽然从概念上来说我认为这是最好的方式,但从程序上来说,我无法形成具有实现这一目标的所有条件的逻辑.我想我需要将所有逻辑放在一个循环中.
任何人都可以告诉它是实现这一目标的正确方法,并指导我解决它,如果这是最好的方法.或者指出任何其他方式(如果可用).
直到最后为止,您不需要将所有数据集打包到 20 字节数组中,因此将它们保存在Int长度为 14 的数组中。这种方式更容易使用。当需要将其发送到硬件时,将其转换为UInt8长度为 20 的数组:
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] = 0b11111111111
packet.dataSets[1] = 0b00000000011
// etc...
let arr = packet.toCArray()
Run Code Online (Sandbox Code Playgroud)
有很多转移操作正在进行,所以我无法全部解释。一般理想是将每个 11 位数据集分配为字节,并根据需要溢出到下一个字节。
| 归档时间: |
|
| 查看次数: |
2343 次 |
| 最近记录: |