将大整数(uint64+)转换为十六进制

问题描述 投票:0回答:1

将内容导入 bigquery 时,我的十六进制字符串被转换为浮点数。我知道我需要修复导入,但我想尽最大努力恢复一些数据。

我正在尽力将它们转换回十六进制,但是,尝试玩具示例会产生意想不到的行为。

例如。给定以下十六进制值:

hh = 0x6de517a18f003625e7fba9b9dc29b310f2e3026bbeb1997b3ada9de1e3cec8d6
# int: 49706871569187420659586066466638340615522392400360198520171375183123350210774
# float: 4.9706871569187424e+76

我不知道为什么最后几位数字从 420 变为 424

尝试将此值转换为浮点数然后再转换回十六进制会严重截断该值

ff = 4.9706871569187424e+76 # same as calling float.fromhex('0x6de517a18f003625e7fba9b9dc29b310f2e3026bbeb1997b3ada9de1e3cec8d6')
int(ff) # 49706871569187423635521182730432496296162592228596139982404260202468916330496
# not sure why getting so many significant figures
hex(int(ff))
# '0x6de517a18f003800000000000000000000000000000000000000000000000000'

对我来说这是意外的,因为十六进制的最后一个非零值发生了变化。 (0036 -> 0038) 我假设它与尾数的表示方式有关,但希望这里的人能快速得到答案,而不是深入研究 python 中的浮点实现。

python floating-point integer hex int128
1个回答
0
投票

感谢 @mark-tolonen 提供指向 53 位 float64 和舍入的指针。对于我的尽力映射来恢复自动转换问题的用例,以下代码就足够了

bb = bin(int(ff))
hex(int(bb[2:53],2)) # 53 bits - 1 bit to get to multiple of 4
# 0x6de517a18f003

更多解释:

十六进制由 4 位表示(2^4 = 16),因此在查看二进制位置时

  • 0..3 - 第一个十六进制值
  • 4..7 - 下一个十六进制值
  • ...
  • 48..51 - 最后完成
  • 52..56 - 这将是不完整的,因为我们只能获得 53 位精度

由于字符串前面带有“0b”,我们采用 2:(2+51),这就是我们得到的

bb[2:53]

© www.soinside.com 2019 - 2024. All rights reserved.