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

How to store two bytes in a BYTE array as an int (or something similar)?

本文关键字:int 存储 字节 两个 数组 BYTE      更新时间:2023-10-16

我正在用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 似乎只包含第一个字节的整数表示形式,我该如何解决这个问题?

提前致谢:)

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

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

由于数据似乎是对齐的,因此您可以使用

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

因为portbinaryBYTE数组,那么*portbinary等价于portbinary[0]

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

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

这假定portbinary是按网络字节顺序传递的。

联合解决方案:

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

如果您的计算机字节序与您从网络获取的表示形式相同,这将起作用。抱歉,我不知道它是如何通过bittorrent协议来的。

如果 endia 是相反的,那么您必然使用的解决方案就没有那么好了:

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