问题描述
我正在尝试将 char 缓冲区转换为多个 int 变量。这是我尝试了一天后得到的结果。
ZeroMemory(buf,4096);
int bytesReceived = recv(sock,buf,4096,0);
if (bytesReceived > 0)
{
/*for (int i = 0; i < bytesReceived; i++)
{
cout << hex << (int)buf[i];
}*/
std::stringstream ss;
std::stringstream aa;
for (int i = 0; i < 2; i++)
ss << std::hex << (int)buf[i];
unsigned result;
ss >> result;
int Number1 = result;
cout << Number1 << "\n";
for (int j = 2; j < 4; j++)
aa << std::hex << (int)buf[j];
unsigned result2;
aa >> result2;
int Number2 = result2;
cout << Number2 << "\n";
}
这在控制台中给了我所需的数字 20000 和 10000。现在我如何做到这一点,而不是每次我想这样做时都写下来,这整个部分:
for (int j = 2; j < 4; j++)
aa << std::hex << (int)buf[j];
unsigned result2;
aa >> result2;
int Number2 = result2;
cout << Number2 << "\n";
从零知识到知识点后,我的大脑现在被炸了。如果有人可以帮助我,我将不胜感激。
解决方法
从您的评论看来,您得到的不是十六进制字符,而是二进制值 2,000。
你可以扔掉你的二进制 -> 字符串 -> 二进制转换并直接从你的缓冲区中获取值。
根据您的代码,我假设您知道您正在获取 2 字节的 short int
值。 recv
返回接收到的字节数,因此您将获得 bytesReceived / 2
值。
您可以直接将它们分配给您的 result
,但我建议使用 network-to-host
函数以实现便携性。
您可以这样做:
int bytesReceived = recv(sock,buf,4096,0);
short int* ibuf = (short int*)buf;
for (int i = 0; i < bytesReceived / 2; ++i,++ibuf) {
short result = ntohs(*ibuf);
std::cout << result << std::endl;
}