【问题标题】:Split two large hex ranges into smaller equal ranges将两个较大的十六进制范围拆分为较小的相等范围
【发布时间】:2021-10-22 00:52:25
【问题描述】:

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

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

我的范围是

Start_Range = 0x800000000000000000000000000000
End_Range = 0xffffffffffffffffffffffffffffff

Numpy 说它们太大而不能作为一个整体分割。

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

即省略 0x

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

感谢您的帮助,我在这个问题上被困了将近一周。

【问题讨论】:

    标签: python numpy range hex bitcoin


    【解决方案1】:

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

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

    • “低”部分,最后 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
    

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

    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(之前计算的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 2013-07-25
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      相关资源
      最近更新 更多