【问题标题】:How do I get a byte array from base64 in swift 3?如何在 swift 3 中从 base64 获取字节数组?
【发布时间】:2017-07-06 07:16:19
【问题描述】:

我正在使用 swift 3 将 Android 应用程序翻译到 iOS。我的问题是下一段 Java 代码:

String b64 = "KJT-AAAhtAvQ";
byte[] bytesCodigo = Base64.decode(b64, Base64.URL_SAFE);
System.out.Println(bytesCodigo.length) // 9

它会如何快速?

谢谢

【问题讨论】:

标签: swift base64 byte decode


【解决方案1】:

只需从 base64 字符串创建一个Data(Objective-C 中的NSData)。但请注意,标准 Data(base64Encoded:) 没有“URL 安全”格式,但您可以创建一个格式,将“-”替换为“+”,将“_”替换为“/”,然后再尝试转换:

extension Data {
    init?(base64EncodedURLSafe string: String, options: Base64DecodingOptions = []) {
        let string = string
            .replacingOccurrences(of: "-", with: "+")
            .replacingOccurrences(of: "_", with: "/")

        self.init(base64Encoded: string, options: options)
    }
}

那么你可以这样做:

guard let data = Data(base64EncodedURLSafe: string) else { 
    // handle errors in decoding base64 string here
    return 
}

// use `data` here

显然,如果它不是“URL 安全”的 base64 字符串,您可以这样做:

guard let data = Data(base64Encoded: string) else { 
    // handle errors in decoding base64 string here
    return 
}

// use `data` here

您问如何获得“字节数组”:Data 实际上是这样的,只要Data 类型符合RandomAccessCollection 协议,就像Array 类型一样。所以,如果你需要它们,你有许多“数组”类型的行为,例如:

for byte in data {
    // do something with `byte`, a `UInt8` value
}

let hexString = data.map { String(format: "%02x", $0) }
    .joined(separator: " ")

print(hexString)                        // 28 94 fe 00 00 21 b4 0b d0

因此,本质上,您通常不需要“字节数组”,因为Data 提供了您可能需要的所有类型的字节访问。此外,无论如何,大多数处理二进制数据的 Swift API 都需要 Data 类型。


如果您确实需要一个 [UInt8] 数组,您可以创建一个:

let bytes = data.map { $0 }

但是,当Data 提供通常需要的所有数组行为等等时,创建单独的字节数组通常效率低下(尤其是当二进制有效负载很大时)。

【讨论】:

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