如何写这个更紧凑

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;
}