swift - 将 [UInt8] 的部分内容转换为 UInt8

标签 swift integer-arithmetic

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

| sync | cmd | length | msg | msg | msg | MSB | LSB |

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

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(中的较低索引>字节数)

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

关于swift - 将 [UInt8] 的部分内容转换为 UInt8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54894693/

相关文章:

ios - Swift - 如何获取具有初始值设定项的数组的索引?

haskell - 787有什么特别之处?

c - x86 上的有符号和无符号算术实现

java - 圆长从 1004L 到 1000L(或 1006L 到 1010L)

ios - Alamofire - 带有自定义 header 的 Rest API 调用

ios - 关于转义 URL 参数中的特殊字符的困惑

ios - 使 Collection 符合自定义协议(protocol)

json - 字典 JSON 的 SWIFT JSONDecoder 类型不匹配错误

java - 这个算术运算有什么问题吗?

c# - CPU 不像人类? 0 + 0 不比 10E12 + 9E15 简单吗?