BitTorrent, DHT, BEP42, Расчет моего NodeId - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь вычислить NodeId в соответствии с BEP42

Я не достаточно умен, чтобы понять пример кода, приведенный в BEP42. Однако приведен алгоритм создания nodeId.as: crc32c ((ip & 0x030f3fff) | (r << 29)) </em>

Существует также таблица результатов, из которой видно, что хороший идентификатор узла для IP-адреса21.75.31.124 начинался бы с 5a3ce9, если бы использовалось случайное начальное число '86' (я полагаю, в десятичном виде). ​​

Поэтому я пробую следующее:

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 имеет некоторый код, используемый для определения, является ли идентификатор узла клиента BEP42-совместимым, но я тоже не понимаю этот код.

Может кто-нибудь сказать мне, что не так с кодом выше?

1 Ответ

0 голосов
/ 01 октября 2018

Все, пожалуйста, не обращайте внимания, ответ:

    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);
...