我像这样显示我的缓冲区:
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
我需要检查是否使用了确切的缓冲区,除了第1个字节,因为它是随机的。
但它不起作用。条件没有执行,我确定unpkt1是0xfb而unpkt2是05,因为缓冲区的打印显示该值。
我尝试使用sprintf
将缓冲区存储为十六进制,但它似乎很乱。还有其他想法吗?
sprintf(buf2, "%02X", unpkt[1]);
答案 0 :(得分:3)
当您比较两个值时,双方应该是signed
或两个unsigned
。
见这个例子:
char x = 0xFB;
if (x == 0xFB)
printf("YES");
else
printf("NO");
输出, 我们期待&#34;是&#34;但我们得到了#34;没有&#34;
NO
您显示的值与您正在测试的值不同:
printf( "%02x ", unsigned char (unpkt[i]) );
删除unsigned char
投射,然后显示值。我想你会看到不同的价值观。
答案 1 :(得分:2)
与0xfb
的比较可能失败(签名与未签名)。如果unpkt
定义为char
,则语句可能需要为:
if((unsigned char)unpkt[1] == 0xfb && (unsigned char)unpkt[2] == 0x05 && (unsigned char)unpkt[3]== 0x20)
{
unpkt = dcpkt;
}
答案 2 :(得分:1)
你坚持printf
(又名C流)或cout
(C ++流)并且不要越过流,因为它会“糟糕,非常糟糕” - 捉鬼敢死队我
尝试使用:
cout << "0x" << hex << (unsigned int) unpkt[i];