如何写这个更紧凑

问题描述

我正在尝试将 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;
}