Я пытаюсь реализовать протокол BitTorent самостоятельно, и у меня возникла проблема с декодированием значения «Peers» в ответе трекера с использованием С++.
В соответствии с документацией по протоколу BitTorent:
peers: (двоичная модель) Вместо использования модели словаря, описанной выше, значением peers может быть строка, состоящая из кратных 6 байтов. Первые 4 байта — это IP-адрес, а последние 2 байта — номер порта. Все в сетевой записи (с обратным порядком байтов).
Как я могу декодировать этот IP-адрес и номер порта с помощью С++?
У меня есть этот код, но он неверен:
void DecodePeers(OrderedMap<std::string, int> &map, const char * buffer, int i)
{
int counter = 0;
while (*(buffer + counter) != NULL)
{
//std::vector<TByte> portNum;
short port;
for (int i = counter; i < counter + 4; i++)
{
//*(peerIp + i - counter) = *(buffer + i);
}
counter += 4;
//*(peerIp + 4) = '\0';
char twobytes[2];
twobytes[0] = *(buffer + counter + 0);
twobytes[1] = *(buffer + counter + 1);
unsigned int x;
std::stringstream ss;
ss << std::hex << twobytes[0];
ss >> x;
// output it as a signed type
std::cout << static_cast<int>(x) << std::endl;
port = ((twobytes[1] << 8) | twobytes[0]);
//port = (short) twobytes;
counter += 2;
//std::string str(portNum.begin(), portNum.end());
std::cout << std::endl;
std::cout << port << std::endl ;
char * bbuffer = new char[100];
for (int i = 0; i < 1; i++) {
//unsigned int inte = (unsigned int)str;(
//_itoa_s((int) *str.c_str(), bbuffer, 100, 10);
//sprintf_s(bbuffer, 50, (const char *) "%d", str.c_str());
}
std::cout << std::endl;
//int port = atoi(portNum);
//map.Insert(str, port);
}
}
Кто-нибудь знает, как я могу перевести эти числа в число - читаемый ответ?
Example of peers value: P^L♠*j.t╤u→πe199711