2013-03-21 75 views
0

我显示我的缓冲区这样的:保存缓存到一个变量

void WINAPI MyUCPackets(char* unpkt, int packetlen, int iR, int arg) 

cout << "[" << packetlen << "] "; 
for (int i = 0; i < packetlen; i++) { 
printf("%02x ", unsigned char (unpkt[i])); 
} 
printf("\n"); 

现在,我需要检查,如果缓冲区的部分包含像一个特定值:

if(unpkt[1] == 0xfb && unpkt[2] == 0x05 && unpkt[3]== 0x20) 
{ 
    unpkt = dcpkt; 
} 

从打印输出:

6C FB 05 20 00 

我需要检查是否使用确切的缓冲区,除了第一个字节,因为它的随机。

但它不起作用。该条件没有得到执行,我相信unpkt1是0xfb,unpkt2是05,因为缓冲区的打印显示该值。

我试图用sprintf来将缓冲区存储为十六进制但看起来很混乱。任何其他想法?

sprintf(buf2, "%02X", unpkt[1]);

+0

什么是你的第一个片段看到输出?你知道C++中的数组是基于零的,是吗? – cdhowie 2013-03-21 16:21:49

+1

你的意思是检查'unpkt [0]'和'unpkt [1]'? – 2013-03-21 16:21:53

+0

我更新了我的问题。谢谢。我不需要'unpkt [0]'它是随机的。我只需要检查其余的。 – madziikoy 2013-03-21 16:23:21

回答

2

0xfb的比较可能会失败(有符号与无符号)。如果unpkt被定义为char,那么该语句可能需要:

if((unsigned char)unpkt[1] == 0xfb && (unsigned char)unpkt[2] == 0x05 && (unsigned char)unpkt[3]== 0x20) 
{ 
    unpkt = dcpkt; 
} 
3

当你比较两个值,双方既要signed或两者unsigned。 看到这个例子:

char x = 0xFB; 

if (x == 0xFB) 
    printf("YES"); 
else 
    printf("NO"); 

输出,我们预计 “YES”,但我们得到了 “NO”

NO


值正在显示与您正在测试的值不同:

printf("%02x ", unsigned char (unpkt[i])); 

删除unsigned char强制转换,然后显示值。我猜你会看到不同的值。

+0

void WINAPI MyUCPackets(char * unpkt,int packetlen,int iR,int arg) – madziikoy 2013-03-21 16:33:38

1

你坚持printf(又名ç流)或cout(C++流)和不交叉流,因为这将是“不好,很不好” - 捉鬼敢死队我

尝试使用:

cout << "0x" << hex << (unsigned int) unpkt[i];