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]);

4

3 回答 3

3

当您比较两个值时,两侧应该是 bothsigned或 both unsigned。看这个例子:

char x = 0xFB;

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

输出,我们期望“YES”,但我们得到“NO”


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

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

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

于 2013-03-21T16:27:49.767 回答
2

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

if((unsigned char)unpkt[1] == 0xfb && (unsigned char)unpkt[2] == 0x05 && (unsigned char)unpkt[3]== 0x20)
{
    unpkt = dcpkt;
}
于 2013-03-21T16:32:56.497 回答
1

你坚持使用printf(又名 C 流)或cout(C++ 流)并且不要跨越流,因为它会“很糟糕,非常糟糕”——捉鬼敢死队 I

尝试使用:

cout << "0x" << hex << (unsigned int) unpkt[i];
于 2013-03-21T16:41:23.943 回答