2430eacc创建于 2024年11月20日历史提交
/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2022-2024. All rights reserved.
 */
package zip4cj.crypto.PBKDF2

class BinTools {
    public static let hex = "0123456789ABCDEF".toArray()

    public static func bin2hex(b: Array<Byte>): String {
        var sb = StringBuilder(2 * b.size)
        for (i in 0..b.size) {
            var v = Int64(b[i]) % 256
            sb.append(hex[((v / 16) & 15)])
            sb.append(hex[((v % 16) & 15)])
        }
        return sb.toString()
    }

    public static func hex2bin(s: String): Array<Byte> {
        var m = s.toRuneArray()
        if (s.size % 2 != 0) {
            // Assume leading zero for odd string length
            m = "0${s}".toRuneArray()
        }
        var r = Array<Byte>(m.size / 2, repeat: 0)
        var i = 0
        for (n in 0..m.size) {
            var h = m[i]
            i++
            var l = m[i]
            i++
            r[n] = UInt8(hex2bin(h) * 16 + hex2bin(l))
        }
        return r
    }

    public static func hex2bin(i: Rune) {
        let c = UInt32(i)
        if (c >= UInt32(r'0') && c <= UInt32(r'9')) {
            return (c - UInt32(r'0'))
        }
        if (c >= UInt32(r'A') && c <= UInt32(r'F')) {
            return (c - UInt32(r'A') + 10)
        }
        if (c >= UInt32(r'a') && c <= UInt32(r'f')) {
            return (c - UInt32(r'a') + 10)
        }
        throw IllegalArgumentException("Input string may only contain hex digits, but found '${i}'")
    }
}