Как конвертировать мой 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
}
}
Эти значения есть в моем коде.
Вы можете напрямую записать UInt8
вместо String
в stringArray
Просто 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)]
Мне нужен массив в этом формате ...... let int8Array: [UInt8] = [ox55,0x55,0xff, 0x01,0x0B, 0x00,0x0B, 0x03,0x07,0x12,0x0E, 0x0C, 0x10,0x09,0x12 , 0x0C, 0x19,0x09,0xFF, 0x14]
Я обновил ответ, вам нужно развернуть опции
я обновил свой код. Пожалуйста, проверьте. При использовании этого значения возвращается другая контрольная сумма. Поэтому я хочу его в [0x01,0x0B, 0x00,0x0B, 0x03,0x07,0x12,0x0E, 0x0C, 0x10,0x09,0x12, 0x0C, 0x19,0x09,0xFF, 0x14] в этом формате
Представление UInt8
в Swift такое же, как и у Int
. 0x55
такой же, как 85
. Синтаксис 0x..
можно использовать только для литералов.
Есть ли способ сделать это, не меняя значение checkSum?
Я не знаю, что делает код контрольной суммы, но мой ответ надежно отображает все шестнадцатеричные представления строк в UInt8
.
Когда я передаю этот тип данных в функцию 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
Массивы находятся разные.
Мне это нужно так же.
Еще раз, если вы конвертируете массив шестнадцатеричных строк в UInt8
, используя мой код, вы получите то же самое. Предполагается, что, как и в вопросе, все значения String начинаются с 0x
Если это вариант, вы можете переключить его, чтобы указать массив 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"]
Нет, у меня нет такой возможности. Хочу наоборот.
Сначала возьмите свой строковый массив и вызовите 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..
})
Вы откуда-то получаете эти значения или они так указаны в вашем коде?