将[UInt8]的部分转换为UInt8

时间:2019-02-26 21:50:13

标签: swift integer-arithmetic

我正在为我的电气工程学士项目编写一个应用程序,并且正在使用代表十六进制字符串的字节数组。收到的字节数组如下所示:

  

|同步| cmd |长度味精|味精|味精| MSB | LSB |

我的问题是如何从字节数组中取出所有“ msg”并将其变成数字? [2]中的“长度”字节描述了将有多少个“ msg”,所以我想用它来计算要变成数字的数组索引的数量。

var receivedBytes: [UInt8] = []
func serialDidReceiveBytes(_ bytes: [UInt8]) {
    receivedBytes = bytes
print(receivedBytes)
}
  

[204,74,3,0,97,168,209,239]

我希望这成为:

var: [UInt8] = [0, 97, 168]

使其像十六进制一样:

[0x00,0x61,0xA8]

然后将此数字设置为0x61A8或十进制25000。

1 个答案:

答案 0 :(得分:1)

给出一个数组:

let bytes: [UInt8] = [204, 74, 3, 0, 97, 168, 209, 239]

让我们获取消息的长度:

let length = Int(bytes[2])

msg是将存储结果的变量:

var msg = 0

index指向整个消息的八位字节的索引,从LSB(bytes中的较高索引)到MSB(bytes中的较低索引)

var index = bytes.count - 3

power是我们移位八位位组的力量

var power = 1

然后我们以这种方式计算消息:

while index > 2 {
    msg += Int(bytes[index]) * power
    power = power << 8
    index -= 1
}

结果是:

print(msg)  //25000

或按照 @JoshCaswell 的建议:

var msg: UInt64 = 0
var index = 3
while index < bytes.count - 2 {
    msg <<= 8 //msg = msg << 8
    msg += UInt64(bytes[index])
    index += 1
}

在两种解决方案中,我们都假定消息可以放入IntUInt64