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

Swift中如何将UInt64转换为无符号十六进制字符串?

Swift中如何将UInt64转换为无符号十六进制字符串?

我太懂这种困扰了!你说的情况我之前处理哈希值的时候也碰到过——用String.init(_:radix:)把有符号整数转十六进制,结果高位一置位就输出带负号的字符串,比如-5DB41312E0C8A0A9,完全不是我们要的无符号结果;而String(format:)又好像默认只处理低32位,这可愁人。

别担心,给你两个靠谱的解决办法:

  • 方法一:转成无符号类型再用radix初始化器
    核心思路就是把你的有符号整数(比如Int64)先转换成对应的无符号类型UInt64,保持二进制位不变,再用radix方法转换。这样初始化器就会按无符号的规则解析数值,不会出现负号了。
    举个例子:

    // 假设你的有符号哈希值是这个
    let hashValue: Int64 = -0x5DB41312E0C8A0A9
    // 转成UInt64,保持二进制位完全一致
    let unsignedHash = UInt64(bitPattern: hashValue)
    // 现在转十六进制就会得到无符号结果
    let hashHex = String(unsignedHash, radix: 16, uppercase: true)
    

    这样得到的就是不带负号的完整十六进制字符串,完美解决补码导致的负号问题。

  • 方法二:用String(format:)指定64位格式符
    如果习惯用格式化字符串的方式,只要用对格式符就行。对于UInt64类型,我们需要用%llX(大写十六进制)或者%llx(小写),如果想要固定16位长度(补零到64位对应的16个十六进制字符),就用%016llX。
    代码示例:

    let unsignedHash: UInt64 = 0xA5DB41312E0C8A0A9
    // 生成16位大写十六进制,不足补零
    let hashHex = String(format: "%016llX", unsignedHash)
    

    这里的ll是告诉格式化函数要处理64位的长整型,这样就不会只截取低32位了。

最后再唠两句为啥之前的方法不行:

  • String.init(_:radix:)处理有符号Int时,会把高位为1的数值识别为负数,所以转十六进制时会带上负号,本质是按有符号数的补码规则输出的;
  • 直接用String(format: "%X")的话,%X默认对应32位整数,所以64位数值会被截断成低32位,自然结果不对。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 11:14:51