Я пытаюсь декодировать значение «peers» в ответе трекера, используя c ++.
Согласно протоколу bittorrent:
peers: (бинарная модель) Вместо использования описанной модели словаря
выше значение пиров может быть строкой, состоящей из кратных 6
байт. Первые 4 байта являются IP-адресом, а последние 2 байта являются портом
число. Все в сетевой (big endian) нотации.
Я пытался до сих пор этот код:
void DecodePeers(OrderedMap<std::string, int> &map, const char * buffer)
{
int counter = 0;
char * peerIp = new char[5];
char * portNum = new char[3];
while (*(buffer + counter) != NULL)
{
for (int i = counter; i < counter + 4; i++)
{
*(peerIp + i - counter) = *(buffer + i);
}
counter += 4;
*(peerIp + 4) = '\0';
for (int i = counter; i < counter + 2; i++)
{
*(portNum + i - counter) = *(buffer + i);
}
counter += 2;
*(portNum + 2) = '\0';
std::string str(peerIp);
int port = atoi(portNum);
map.Insert(str, port);
}
}
Моя проблема в том, что этот код дает мне номер порта: 7643488, который явно не может быть номером порта. У кого-то есть идея, что я сделал не так?
atoi (PortNum);
Это для преобразования ascii / человекочитаемых строк, представляющих числа 10 оснований, в целочисленные типы. Другими словами, вы могли только поставить строку "00"
в "99"
в 2 байта. Номера портов: 0-65535, то есть uint16, который вписывается в 2 байта без какой-либо кодировки.
Все, что вам нужно сделать, это учесть порядок байтов.
Других решений пока нет …