我正在尝试根据符合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,但我也不理解该代码。
谁能告诉我上面的代码有什么问题?