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



我已经在一个问题上停留了好几天了。我已经尝试了很多方法,包括将十六进制转换为 dec,然后再次转换回来,但我没有运气。

对于那些感兴趣的人,我正在为正在查看比特币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 个十六进制数字。

实际上,您只对两个"上部"感兴趣,因此请设置您的 范围边框作为字符串包含十六进制数字,不带首字母 "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

要生成子范围边框表,请运行:

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

当然,每个边框的"true"值可以乘以每个 值2 ** 32,但您实际上不需要它们(表示为整数)。

还将源值拆分为"下部"和"上部",并决定 它完全基于值的上半部分去哪个"目标子范围" 有问题的。

编辑

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

最新更新