【问题标题】:How to convert convert [String] to [UInt8] in swift?如何快速将 [String] 转换为 [UInt8]?
【发布时间】:2019-04-04 16:21:29
【问题描述】:

如何将我的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
}

}

【问题讨论】:

  • 您是从某个地方收到这些值还是在您的代码中这样指定它们?
  • 这个值在我的代码中。
  • stringArray中可以直接写UInt8而不是String

标签: ios arrays swift converters


【解决方案1】:

如果它是一个选项,您可以切换它以指定 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"]

【讨论】:

  • 没有。我没有这个选项。我想要反之亦然。
【解决方案2】:

只是 map 的东西,你必须删除 0x 才能使 UInt8(_:radix:) 初始化工作。

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

【讨论】:

  • 它显示了这个输出:[Optional(85), Optional(85), Optional(255), Optional(1), Optional(11), Optional(56), Optional(24),可选(49),可选(16),可选(24),可选(14),可选(22),可选(49),可选(16),可选(24),可选(22),可选(48),可选(17),可选(24),可选(32),可选(225)]
  • 我想要这种格式的数组......让 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] 这种格式
  • Swift 中的UInt8 表示与Int 相同。 0x5585 相同。 0x.. 语法只能用于文字。
【解决方案3】:

首先获取您的字符串数组并在其上调用map,然后将其映射到[UInt8](其中总结果将为[[UInt8]],并在结果上调用flatMap以获得[UInt8]的数组。 . 然后你可以在上面做forEach 来计算你的校验和或者w/e..

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    相关资源
    最近更新 更多