2013-03-21 72 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];