2011-03-18 133 views
3

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

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打印了相同的值,但比较失败并且循环中断。

+2

出于普遍的兴趣 - 你添加的演员是否实际上改变了任何东西? – configurator 2011-03-18 01:48:27

+0

我在这里找不到任何东西;可能会添加一些代码以将'buffer1'和'buffer2'转储到磁盘,将它们存储到'/ tmp/1'和'/ tmp/2'中,并分解出'od -x'或'xxd'来试图找到问题? – sarnold 2011-03-18 01:49:16

+0

你怎么知道中断退出循环?我退出时的价值是什么?为什么不使用memcmp? – Sean 2011-03-18 01:50:19

回答

3

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

在我看来,就像当你看着它的数据发生了变化。想到两个简单的问题:

  1. 如果你在调试器中运行它,然后循环一遍,那么它是否仍然会发生?如果没有,那么我强烈怀疑我的第二个问题会引导你回答问题。
  2. 读取操作是异步的吗?当你进入for循环时,数据似乎还在被读取,这意味着你没有等待读取完成。
+0

我认为你的第二点是问题。我发布的代码中的缓冲区,我通过阅读网络直接获取它们。我从这些缓冲区复制到临时缓冲区并进行比较。并解决了这个问题。 – Romonov 2011-03-18 01:59:54

+0

非常好。确保在尝试访问数据之前始终等待操作完成;通常有一种方法可以让你等待它完成,或者一个回调你可以注册,一旦完成就会发生。 – configurator 2011-03-18 02:03:15

+0

btw读取操作不是异步的。插座被阻塞。所以我想这个问题是由于内核级别的操作系统对缓冲区的缓慢管理造成的。 – Romonov 2011-03-18 02:07:40

2

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