如何将BYTE数组中的两个字节存储为int(或类似的东西)?

时间:2012-08-09 18:09:50

标签: c++ bittorrent

我正在用C ++编写一个bittorrent客户端,它接收来自包含几个6字节字符串的跟踪器(服务器)的消息。前4个字节表示对等体的IP地址,接下来的2个字节表示对等体正在侦听的端口号。

我已经研究了如何将ip字节转换为人类可读的ip地址,但我很难将表示端口号的两个字节转换为int(或类似的东西)

到目前为止,我的努力是:

BYTE portbinary[2];
unsigned short peerport;

//trackers[i]->peersBinary[j * 6 + 4] is the first byte
portbinary[0] = trackers[i]->peersBinary[j * 6 + 4];
//trackers[i]->peersBinary[j * 6 + 5] is the second byte
portbinary[1] = trackers[i]->peersBinary[j * 6 + 5];
peerport = *portbinary;

经过检查,peerport似乎只包含第一个字节的整数表示,我怎么能解决这个问题呢?

提前致谢:)

4 个答案:

答案 0 :(得分:3)

我更喜欢使用按位运算而不是类型惩罚,因为它根本不会产生字节序问题(端口号是一个大端数,而今天许多系统都是小端)。

int peerport = (portbinary[0] << 8) | portbinary[1];

答案 1 :(得分:1)

由于数据似乎已对齐,您只需使用

即可
peerport = ntohs(*(uint16_t *)(trackers[i]->peersBinary + j * 6 + 4));

答案 2 :(得分:1)

由于portbinaryBYTE的数组,因此*portbinary相当于portbinary[0]

实现结果的便携式方法可能是:

peerport = portbinary[0];
peerport = 256*peerport + portbinary[1];

这假定portbinary以网络字节顺序传递。

答案 3 :(得分:-1)

工会解决方案:

union port_extractor
{
    BYTE raw_port[2];
    unsigned short port_assembled;
};

如果您的计算机字节顺序与从网络中获取的表示形式相同,则此方法有效。对不起,我不知道它是如何通过bittorrent协议来的。

如果结尾是相反的,那么您必须使用的解决方案就不那么好了:

unsigned short port_assembled = (unsigned short)raw_port[first_byte] | ((unsigned short)raw_port[second_byte] << 8);
// first_byte = 0, second_byte = 1 or vice versa 
// depending on source data endianess