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
相关产品推荐
相关产品推荐

