【问题标题】:How to write this more compact如何写得更紧凑
【发布时间】:2021-07-01 14:36:58
【问题描述】:

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

从零知识到现在,我的大脑被炸了。如果有人可以帮助我,将不胜感激。

【问题讨论】:

  • 如果代码正常工作,而您现在只是在尝试优化它,那么您应该改为在CodeReview 上提问。
  • @RemyLebeau 谢谢,我会在那里问。我刚刚让它像这样工作已经写了一个小时的问题,在这之间我得到了我尝试过的想法,这就是为什么现在它正在工作。我最初的问题是如何将 char 缓冲区转换为整数,因为我做不到。
  • 您的buf 中有什么内容?代表十六进制值的字符,0..F?您是否一次将它们转换为整数两个字符?你怎么得到超过 255 的东西?
  • 我建议在互联网上搜索“C++ 序列化库”。
  • @VladFeinstein 在 buf 中我从 tcp 流字节中获取,但出于某种原因,我使用 winsock 的方式我只在 4e20(十六进制)的 buf 中获取字符,我得到 N(4e)和一个空格(20) 对于 buf 的前两个字节

标签: c++ string integer hex buffer


【解决方案1】:

从您的评论看来,您得到的不是十六进制字符,而是二进制值 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;
}

【讨论】:

  • 谢谢!这正是我希望它工作的方式!我更新了我正在接受的东西,但我尝试的所有东西都返回了,因为我说的是后者,所以而不是数字。现在我会试着理解你做了什么。我对编程完全陌生,所以我不知道如何处理收到的内容。
猜你喜欢
  • 1970-01-01
  • 2010-09-09
  • 2011-05-27
  • 1970-01-01
  • 2011-02-12
  • 2017-07-03
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多