我正在尝试使用c ++解码跟踪器响应中的“peers”值。
根据bittorrent协议:
peer :(二进制模型)而不是使用描述的字典模型 在上面,对等体值可以是由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) = '\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,显然不能是端口号。有人知道我做错了什么?
答案 0 :(得分:0)
的atoi(端口编号);
用于将表示基数为10的ascii /人类可读字符串转换为整数类型的字符串。换句话说,您只能将字符串"00"
放入"99"
2个字节。端口号为0-65535,这是一个uint16,按原样适合2个字节而不进行任何编码。
您需要做的就是考虑字节顺序。