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

