Конвертировать части [UInt8] в UInt8 - PullRequest
0 голосов
/ 27 февраля 2019

Я пишу приложение для своего бакалаврского проекта в области электротехники и работаю с байтовым массивом, который представляет шестнадцатеричную строку.Полученный байтовый массив выглядит так:

|синхронизировать |cmd |длина |сообщение |сообщение |сообщение |MSB |LSB |

Мой вопрос: как я могу получить все "msg" из байтового массива и превратить их в число?Байт "length" в [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 голосов
/ 27 февраля 2019

Учитывая массив:

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

...