You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中转换超过UInt64.max的超大十进制数为十六进制的方法

处理超过UInt64.max的十进制数转十六进制

我们平时用String(format:)确实能轻松把Int/Long范围内的整数转成十六进制:

// Int示例
print(String(format:"%x", 1111)) // 输出: 457
// Long示例
print(String(format:"%lx", 11111111111111)) // 输出: a1b01d4b1c7

但这种方式的问题在于,它只能处理UInt64范围内的数值——一旦输入的十进制数超过18446744073709551615(也就是UInt64.max),常规的整数类型根本存不下这个数,更别说用format转换了。针对这种超大整数的转换,我们有两种可靠的方案:

方案一:使用任意精度整数类型(推荐)

在Swift中,你可以借助任意精度整数库来处理超大数值,比如流行的第三方库BigInt(可通过Swift Package Manager导入)。它能无缝处理远超UInt64上限的整数,并且直接支持十六进制转换:

import BigInt

// 用字符串初始化超大整数(因为普通类型存不下)
let hugeDecimalString = "18446744073709551616" // 比UInt64.max大1
if let bigInt = BigInt(hugeDecimalString) {
    let hexString = String(bigInt, radix: 16, uppercase: false)
    print(hexString) // 输出: 10000000000000000
}

如果不想依赖第三方库,也可以使用Swift标准库中的Int128/UInt128(不过它们依然有上限,仅适用于超过UInt64但没超出UInt128的数值):

let hugeUInt128 = UInt128(18446744073709551616)
let hexString = String(hugeUInt128, radix: 16)
print(hexString) // 输出: 10000000000000000

方案二:手动实现字符串十进制转十六进制

如果你完全不想依赖任何库,可以自己实现基于字符串的进制转换逻辑。核心思路是模拟手工进制转换的过程:反复用十进制字符串除以16,记录余数(对应十六进制的一位),直到被除数为0,最后反转余数序列得到结果。

示例实现:

func decimalStringToHex(_ decimalStr: String) -> String? {
    let hexDigits = "0123456789abcdef"
    var remainder = decimalStr
    var hexChars = [Character]()
    
    while remainder != "0" {
        // 计算 remainder 除以16的商和余数
        let (quotient, rem) = divideDecimalStringBy16(remainder)
        hexChars.append(hexDigits[hexDigits.index(hexDigits.startIndex, offsetBy: rem)])
        remainder = quotient
        if quotient == "" {
            break
        }
    }
    
    return hexChars.isEmpty ? "0" : String(hexChars.reversed())
}

// 辅助函数:十进制字符串除以16,返回(商字符串, 余数Int)
func divideDecimalStringBy16(_ decimalStr: String) -> (String, Int) {
    var quotient = ""
    var remainder = 0
    
    for char in decimalStr {
        guard let digit = Int(String(char)) else {
            return ("", 0)
        }
        let current = remainder * 10 + digit
        let q = current / 16
        remainder = current % 16
        if !quotient.isEmpty || q != 0 {
            quotient.append(String(q))
        }
    }
    
    return (quotient.isEmpty ? "0" : quotient, remainder)
}

// 使用示例
if let hex = decimalStringToHex("18446744073709551616") {
    print(hex) // 输出: 10000000000000000
}

这个方法可以处理任意长度的十进制数字符串,完全不受整数类型上限的限制。

内容的提问来源于stack exchange,提问作者KingHodor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:17:24