将 [UInt8] 的部分内容转换为 UInt8
Convert parts of [UInt8] into UInt8
我正在为我的电气工程学士学位项目编写一个应用程序,我正在使用一个表示十六进制字符串的字节数组。接收到的字节数组如下所示:
| sync | cmd | length | msg | msg | msg | MSB | LSB |
我的问题是如何从字节数组中取出所有 "msg" 并将它们变成一个数字?
[2] 中的 "length" 字节描述了 "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
给定一个数组:
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
}
在这两种解决方案中,我们假设消息可以放入 Int
或 UInt64
我正在为我的电气工程学士学位项目编写一个应用程序,我正在使用一个表示十六进制字符串的字节数组。接收到的字节数组如下所示:
| sync | cmd | length | msg | msg | msg | MSB | LSB |
我的问题是如何从字节数组中取出所有 "msg" 并将它们变成一个数字? [2] 中的 "length" 字节描述了 "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
给定一个数组:
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
}
在这两种解决方案中,我们假设消息可以放入 Int
或 UInt64