Как конвертировать конвертировать [String] в [UInt8] в Swift? - PullRequest
0 голосов
/ 31 октября 2018

Как конвертировать мои 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
}

}

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

Если это опция, вы можете переключить ее, указав массив 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"]
0 голосов
/ 31 октября 2018

Сначала возьмите ваш строковый массив и вызовите 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..
})
0 голосов
/ 31 октября 2018

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

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