Как быстро преобразовать [String] в [UInt8]?

Как конвертировать мой stringArray в int8Array. Пожалуйста, дайте мне какое-нибудь решение, чтобы преобразовать это. Я хочу ниже тип массива

let int8Array:[UInt8] = [ox55,0x55,0xff,0x01,0x0B,0x00,0x0B,0x03,0x07,0x12,0x0E,0x0C,0x10,0x09,0x12,0x0C,0x19,0x09,0xFF,0x14]

Ниже мой ViewController:

class ViewController:UIViewController {
var checkSum:UInt8 = 0
override func viewDidLoad() {
    super.viewDidLoad()

let stringArray:[String] = ["0x55", "0x55", "0xff", "0x01", "0x0B", "0x38", "0x18", "0x31", "0x10", "0x18", "0x0E", "0x16", "0x31", "0x10", "0x18", "0x16", "0x30", "0x11", "0x18", "0x20", "0xE1"]
    var int8Array:[UInt8] = stringArray.map{ UInt8($0.dropFirst(2), radix: 16)! }
    int8Array.removeFirst()
    int8Array.removeFirst()
    int8Array.removeFirst()
    print(int8Array)
    for item in int8Array {
        checkSum = calculateCheckSum(crc: checkSum, byteValue: UInt8(item))
    }
    print(checkSum)

}

func calculateCheckSum(crc:UInt8, byteValue: UInt8) -> UInt8 {
    let generator: UInt8 = 0x1D

    var newCrc = crc ^ byteValue

    for _ in 1...8 {
        if (newCrc & 0x80 != 0) {
            newCrc = (newCrc << 1) ^ generator
        }
        else {
            newCrc <<= 1
        }
    }
    return newCrc
}

}

Вы откуда-то получаете эти значения или они так указаны в вашем коде?

Padarom 31.10.2018 14:24

Эти значения есть в моем коде.

Dhasal 31.10.2018 14:25
stackoverflow.com/questions/27189338/…?
Larme 31.10.2018 14:27

Вы можете напрямую записать UInt8 вместо String в stringArray

Anurag Sharma 13.06.2019 13:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
4
578
3

Ответы 3

Просто map, вам нужно удалить 0x, чтобы инициализатор UInt8(_:radix:) заработал.

let uint8Array = stringArray.map{ UInt8($0.dropFirst(2), radix: 16)! }

Он показывает мне этот вывод: [Необязательно (85), Необязательно (85), Необязательно (255), Необязательно (1), Необязательно (11), Необязательно (56), Необязательно (24), Необязательно (49), Необязательно (16 ), Дополнительно (24), Дополнительно (14), Дополнительно (22), Дополнительно (49), Дополнительно (16), Дополнительно (24), Дополнительно (22), Дополнительно (48), Дополнительно (17), Дополнительно (24 ), Необязательно (32), Необязательно (225)]

Dhasal 31.10.2018 14:45

Мне нужен массив в этом формате ...... let int8Array: [UInt8] = [ox55,0x55,0xff, 0x01,0x0B, 0x00,0x0B, 0x03,0x07,0x12,0x0E, 0x0C‌, 0x10,0x09,0x12 , 0x0C‌, 0x19,0x09,0xFF, 0x14‌]

Dhasal 31.10.2018 14:46

Я обновил ответ, вам нужно развернуть опции

vadian 31.10.2018 14:47

я обновил свой код. Пожалуйста, проверьте. При использовании этого значения возвращается другая контрольная сумма. Поэтому я хочу его в [0x01,0x0B, 0x00,0x0B, 0x03,0x07,0x12,0x0E, 0x0C, 0x10,0x09,0x12‌, 0x0C, 0x19,0x09,0xFF‌, 0x14] в этом формате

Dhasal 31.10.2018 15:04

Представление UInt8 в Swift такое же, как и у Int. 0x55 такой же, как 85. Синтаксис 0x.. можно использовать только для литералов.

vadian 31.10.2018 15:08

Есть ли способ сделать это, не меняя значение checkSum?

Dhasal 31.10.2018 15:18

Я не знаю, что делает код контрольной суммы, но мой ответ надежно отображает все шестнадцатеричные представления строк в UInt8.

vadian 31.10.2018 15:20

Когда я передаю этот тип данных в функцию calculateCheckSum [0x01,0x0B, 0x00,0x0B, 0x03,0x07,0x12,0x0E, 0x0C, 0x10,0x09,0x12‌, 0x0C, 0x19,0x09,0xFF‌, 0x14], она возвращает 225, и при использовании этого [1, 11, 56, 24, 49, 16, 24, 14, 22, 49, 16, 24, 22, 48, 17, 24, 32, 225] он показывает другое, т.е. 128

Dhasal 31.10.2018 15:27

Массивы находятся разные.

vadian 31.10.2018 15:30

Мне это нужно так же.

Dhasal 31.10.2018 15:32

Еще раз, если вы конвертируете массив шестнадцатеричных строк в UInt8, используя мой код, вы получите то же самое. Предполагается, что, как и в вопросе, все значения String начинаются с 0x

vadian 31.10.2018 15:35

Если это вариант, вы можете переключить его, чтобы указать массив UInt8 и получить из него массив String.

let int8Array: [UInt8] = [0x55, 0x55, 0xa5, 0x3f]
var stringArray: [String] {
  return int8Array.map { String(format: "0x%02X", $0) }
}

print(stringArray)
// ["0x55", "0x55", "0xA5", "0x3F"]

Нет, у меня нет такой возможности. Хочу наоборот.

Dhasal 31.10.2018 15:40

Сначала возьмите свой строковый массив и вызовите map, затем сопоставьте его с [UInt8] (где общий результат будет [[UInt8]] и вызовите flatMap для результата, чтобы получить массив [UInt8] .. затем вы можете использовать forEach для вычисления контрольной суммы или мы..

[String].init().map({
    [UInt8]($0.utf8)
}).flatMap({ $0 }).forEach({
    print($0) //Print each byte or convert to hex or w/e..
})

Другие вопросы по теме