【问题标题】:char buffers comparison字符缓冲区比较
【发布时间】:2011-03-18 01:40:51
【问题描述】:

我有两个 char 缓冲区,我试图比较它们的一部分。我有一个奇怪的问题。我有以下代码:

char buffer1[50], buffer2[60]; 
// Get buffer1 and buffer2 from the network by reading sockets
for(int i = 0; i < 20; i++)
{
    if(buffer1[15+i] != buffer2[25+i])
    {
        printf("%c", buffer1[15+i]);
        printf("%c", buffer2[25+i]);
        printf("%02x", (unsigned char)buffer1[15+i]);
        printf("%02x", (unsigned char)buffer2[25+i]);
        break;
    }
}

上面的代码是我实际代码的简化版本,我没有在这里复制粘贴,因为它太长了。以防万一这可能会有所帮助,我通过读取套接字在网络上获得了这两个缓冲区。

问题是即使两个缓冲区相同,循环也会中断。为了检查缓冲区中的内容,我在 if 语句中添加了两个打印语句。奇怪的是,printf 语句都为 %c 和 %02x 打印相同的值,但是比较失败并且循环中断。

【问题讨论】:

  • 出于普遍的兴趣 - 你添加的演员阵容真的改变了什么吗?
  • 我在这里看不到任何东西;也许添加一些代码将buffer1buffer2转储到磁盘,将它们存储到/tmp/1/tmp/2中,然后破解od -xxxd来尝试找出问题?
  • 怎么知道break退出循环?退出时 i 的值是多少?为什么不使用 memcmp?
  • 我忘了在我的代码中的这篇文章中添加演员表。所以我编辑了这篇文章。我还没有尝试在没有演员表的情况下运行代码。

标签: comparison char buffer


【解决方案1】:

(免责声明:我不是 C/++ 专家)

在我看来,当您查看数据时数据正在发生变化。想到两个简单的问题:

  1. 如果您在调试器中运行它,并一步一步地遍历循环,它仍然会发生吗?如果不是,那么我强烈怀疑我的第二个问题会引导您找到答案。
  2. 读操作是异步的吗?当您在 for 循环中时,似乎仍在读取数据,这意味着您没有等待读取完成。

【讨论】:

  • 我认为您的第二点是问题所在。我发布的代码中的缓冲区,我通过阅读网络直接得到它们。我从这些缓冲区复制到临时缓冲区并进行比较。这样就解决了问题。
  • 优秀。确保始终等到操作完成后再尝试访问数据;通常有一个你应该调用的方法等待它完成,或者你可以注册一个回调,一旦完成就会发生。
  • 顺便说一句,读取操作不是异步的。套接字阻塞。所以我猜这个问题是由于操作系统在内核级别的缓冲区管理缓慢。
【解决方案2】:

我唯一看到的是时间问题。如果它们在 if 语句中不同,而在 print 语句中相同,则有人在两者之间进行了更改。

【讨论】:

    猜你喜欢
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    相关资源
    最近更新 更多