如何写这个更紧凑
How to write this more compact
我正在尝试将一个 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
returns 接收到的字节数,因此您将获得 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;
}
我正在尝试将一个 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
returns 接收到的字节数,因此您将获得 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;
}