将缓冲区存储到变量中

时间:2013-03-21 16:19:41

标签: c++ winsock

我像这样显示我的缓冲区:

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

3 个答案:

答案 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];