0

我正在尝试根据符合BEP42的 NodeId 计算

我不够聪明,无法理解 BEP42 中给出的示例代码但是创建 nodeId 的算法给出为: crc32c((ip & 0x030f3fff) | (r << 29))

还有一个结果表,从中我们可以看到,如果使用的随机种子是“86”(我假设是十进制),那么 IP 地址 21.75.31.124 的一个好的节点 ID 将从 5a3ce9 开始。

所以我尝试以下方法:

InetSocketAddress a = new InetSocketAddress("21.75.31.124",6881);
byte[] ba = a.getAddress().getAddress();
int ia = ByteBuffer.wrap(ba).order(ByteOrder.BIG_ENDIAN).getInt();
int r = 86;
int calc = (ia & 0x030f3fff) | (r<<29);
Crc32C crc = new Crc32C();
crc.update(calc);
int foo = crc.getIntValue();
byte[] ret = ByteBuffer.allocate(4).putInt(foo).array();
String retStr = Hex.encodeHexString(ret);
System.out.println("should be : 5a3ce9 is " + retStr);

但是我得到了 6ea6c88c,这几乎在所有方面都是错误的。8472 有一些代码用于确定客户端的 nodeId 是否符合 BEP42,但我也不理解该代码。

谁能告诉我上面的代码有什么问题?

4

1 回答 1

0

所有,请忽略,答案是:

    InetSocketAddress a = new InetSocketAddress("21.75.31.124",6881);
    byte[] ip = a.getAddress().getAddress();
    int r = 86;

    byte[] mask = { 0x03, 0x0f, 0x3f, (byte) 0xff };   
    for(int i=0;i<mask.length;i++) {
        ip[i] &= mask[i];
    }
    ip[0] |= r << 5;
    Crc32C c = new Crc32C();
    c.update(ip, 0, Math.min(ip.length, 8));
    int crcVal = (int)c.getValue();
    String s = Integer.toHexString(crcVal);             

    System.out.println("should be : 5a3ce9 is " + s);
于 2018-10-01T11:19:59.493 回答