Как быстро преобразовать [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
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..
})

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