将两个大的十六进制范围分成较小的相等范围

Split two large hex ranges into smaller equal ranges

我被一个问题困了好几天了。我尝试了很多方法,包括将十六进制转换为十进制然后再转换回来,但我没有运气。

对于那些感兴趣的人,我正在为正在查看比特币 120 拼图的人创建软件。 https://privatekeys.pw/puzzles/bitcoin-puzzle-tx

我的范围是

Start_Range = 0x800000000000000000000000000000
End_Range = 0xffffffffffffffffffffffffffffff

Numpy 表示它们太大而无法拆分为整个范围。

我想要的结果可能是多维列表中这两个十六进制范围之间有 500,000 - 1,000,000 个相等的子范围。

即省略 0x

[[80000, 800FF], ....]

感谢您的帮助,我已经被困了将近一个星期了。

您的字符串文字确实太长,无法将它们转换为整数。

但您可以将它们“拆分”为两部分:

  • “低”部分,最后 16 个十六进制数字,
  • “上”部分,前 14 个十六进制数字。

实际上,您只对“上部”两个部分感兴趣,所以设置您的 范围边界为 strings 包含十六进制数字,没有初始 “0x”:

Start_Range = '800000000000000000000000000000'
End_Range   = 'ffffffffffffffffffffffffffffff'

然后将每个边框的两个“上部”设置为:

x1 = int(Start_Range[0:14], 16)
x2 = int(End_Range[0:14], 16)

这次是整数

计算此范围的大小

siz = x2 - x1

当您打印它们时,您将得到:

36028797018963968 72057594037927935 36028797018963967

为简单起见,假设您想将源范围拆分为 10个子范围,所以定义:

n = 10

并生成子范围边界的table,运行:

tbl = np.arange(x1, x2, siz // n)

您可以使用以下代码打印每个子范围的边框及其大小:

t1 = tbl[0]
for i in range(1, len(tbl)):
    t2 = tbl[i]
    print(f'{i:3}:  {t1},  {t2},  {t2 - t1}')
    t1 = t2

得到:

 1:  36028797018963968,  39631676720860364,  3602879701896396
 2:  39631676720860364,  43234556422756760,  3602879701896396
 3:  43234556422756760,  46837436124653156,  3602879701896396
 4:  46837436124653156,  50440315826549552,  3602879701896396
 5:  50440315826549552,  54043195528445948,  3602879701896396
 6:  54043195528445948,  57646075230342344,  3602879701896396
 7:  57646075230342344,  61248954932238740,  3602879701896396
 8:  61248954932238740,  64851834634135136,  3602879701896396
 9:  64851834634135136,  68454714336031532,  3602879701896396
10:  68454714336031532,  72057594037927928,  3602879701896396

当然,每个边框的“真实”值可以通过将每个边框相乘来计算 2 ** 32 的值,但实际上您不需要它们(表示为整数)。

还将您的源值拆分为“较低”和“较高”部分并决定 它的“目标子范围”完全基于值的上部 有问题。

编辑

一个小修正:最后一个子范围的上限实际上是 x2(较早计算)。