微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何写这个更紧凑

如何解决如何写这个更紧凑

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。