我需要形成一个20字节的数据包,然后将有效负载通过蓝牙发送到硬件外围设备。
这个20字节的数据包内部分为14个数据集,每个11位,最后6位应为空字符。
因此,总计: 160位(20个字节)= 14(组)* 11(位)+ 6(空字符)
11位又分为3组,分别为2位,3位和6位。但是,对于主要问题并不重要,我目前可以通过采用“ Int16”构成11位。我知道对11位进行移位操作。
如果我只有一个数据集,那么我应该用空字符填充除前11位之外的所有20个字节,如果我有两个数据集,那么除22位以外的所有字节都应该分别为空字符和。
我面临的问题是由于11的奇数位而形成了这个连续的160位。我想到了一个'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()
正在进行很多转换操作,所以我无法全部解释。通常的理想做法是将每个11位数据集分配为字节,然后根据需要溢出到下一个字节。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句