Я пишу простой torrent-клиент в Qt, и я не понимаю, как получить IP-адреса и порты пиров из ответа трекера. Я получаю ответ успешно, но именно значение ключа peers
выглядит нечитаемым
d8:completei1976e10:incompletei54e8:intervali1800e5:peers6:TQ+ГХ§e
Почему так выглядит и как сделать эти данные читабельными?
В спецификации BitTorrent сказано, что значение peers
всегда отправляется в Big-Endian. Я не знаю, может ли это быть причиной нечитаемости, но я подозреваю это.
Как сказал Энкомб в комментариях, это BigEndian. Вы можете сделать это программно следующим образом:
QByteArray peerTmp = "TQ+ГХ§e";
QHostAddress host;
uchar *data = (uchar *)peerTmp.constData();
uint ipAddress = 0;
uint port = (int(data[4]) << 8) + data[5];
ipAddress += uint(data[0]) << 24;
ipAddress += uint(data[1]) << 16;
ipAddress += uint(data[2]) << 8;
ipAddress += uint(data[3]);
host.setAddress(ipAddress);
qDebug() << "IP" << host.toString() << ":" << port;
IP 84.81.XX.208: 37840
или если вы используете qFromBigEndian
я. е.
QHostAddress peerIPAddress(qFromBigEndian<qint32>("TQ+Г"));
qDebug() << "IP" << peerIPAddress.toString();
Увидеть : http://doc.qt.io/qt-5/qtnetwork-torrent-trackerclient-cpp.html
Других решений пока нет …