Java与Python十六进制转long值结果不同的原因及解决方法
问题原因
你遇到的差异本质是Java的long类型是64位有符号整数,而Python的int是无符号任意精度整数。
你的十六进制字符串d24ec4f1a98c6e5b对应的数值是15154266338359012955,这个值超过了Java long的最大值9223372036854775807(即2^63-1)。Java在将BigInteger转换为long时,会按照补码规则把超出范围的数值转换为负数,而Python则直接保留完整的无符号数值。
解决方法
方法1:在Python中获得与Java一致的有符号long值
通过计算补码模拟Java的转换逻辑:
hexString = "d24ec4f1a98c6e5b" unsigned_val = int(hexString, 16) # 计算64位有符号long的补码结果 signed_val = unsigned_val if unsigned_val <= 0x7FFFFFFFFFFFFFFF else unsigned_val - 0x10000000000000000 print(signed_val) # 输出:-3292477735350538661
方法2:在Java中获得与Python一致的无符号数值
Java 8及以上版本支持Long.parseUnsignedLong方法,可直接解析无符号十六进制字符串:
String hexString = "d24ec4f1a98c6e5b"; System.out.println(Long.parseUnsignedLong(hexString, 16)); // 输出值 -> 15154266338359012955
也可以直接用BigInteger输出完整的无符号数值:
String hexString = "d24ec4f1a98c6e5b"; System.out.println(new BigInteger(hexString, 16)); // 输出值 -> 15154266338359012955
内容的提问来源于stack exchange,提问作者Tevfik Kiziloren
相关产品推荐
相关产品推荐

