将两个大的十六进制范围分成较小的相等范围
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(较早计算)。
我被一个问题困了好几天了。我尝试了很多方法,包括将十六进制转换为十进制然后再转换回来,但我没有运气。
对于那些感兴趣的人,我正在为正在查看比特币 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(较早计算)。