我正在尝试使用c++解码跟踪器响应中的"peers"值。
根据bittorrent协议:
peers: (binary model)不使用所描述的字典模型上面,peers值可以是由6的倍数组成的字符串字节。前4个字节是IP地址,后2个字节是端口号码。全网络(大端)表示法
我一直在尝试到目前为止这个代码:
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) = ' ';
for (int i = counter; i < counter + 2; i++)
{
*(portNum + i - counter) = *(buffer + i);
}
counter += 2;
*(portNum + 2) = ' ';
std::string str(peerIp);
int port = atoi(portNum);
map.Insert(str, port);
}
}
我的问题是这个代码给了我端口号:7643488,这显然不能是一个端口号。有人知道我做错了什么吗?
atoi (portNum);
用于将ascii/人类可读的以10为基数的字符串转换为整数类型。换句话说,您只能将字符串"00"
到"99"
放入2个字节。端口号是0-65535,这是一个uint16类型,可以容纳2个字节,不需要任何编码。
你所需要做的就是考虑字节顺序。