如何将 BYTE 数组中的两个字节存储为 int(或类似的东西)
How to store two bytes in a BYTE array as an int (or something similar)?
我正在用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));
因为portbinary
是BYTE
数组,那么*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
相关文章:
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 在c++中获取两个大int,并将它们存储在数组中
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 如果 x < 10,则添加前导 0 并将其存储为 int
- 如何读取 TXT 文件并仅将 int 存储在 C 中
- 如何在函数中将字符串和分数存储为(Int 或 float)
- 如何声明一个必须在C++中同时存储int和char值的2D数组
- 如果char可以在C++中存储数字,为什么我们需要int
- 如果我在 C++ 中为 int 提供双精度,输入缓冲区中存储了什么?
- 我应该使用无符号字符而不是 int 来存储永远不会大于 255 的值吗?
- 我正在编写一个代码来将 int 数组存储在文件中,然后用 c++ 检索它,但是检索第一项是假值,我该如何解决这个问题?
- unordered_set是否适合存储矢量<int>元素的数据结构?如果是这样,我将如何实现哈希函数?
- 什么是在C 中存储结果INT*的最佳数据类型
- char*中存储的返回int值(0-255)给出了负值
- 将字符指针按顺序存储在 map 中 std::map<char*, int> mymap。将其存储为字符或字符串不是一个选项
- 如何在文件中节省空间地存储和检索 std::vector<int> 值
- 如何将char和int存储在同一个变量中
- c++int存储为char*转换中的字符,无需任何API
- Vector将int存储为ascii码
- c++11将数据从一个int*存储到另一个int