2017-05-08 82 views
0

我知道這個問題已經被問了很多次。我遇到了一個問題,我通過serial communicationubuntu收到幾個hex bytes。我寫了一個讀取所有數據並顯示它的C代碼。它工作正常,因爲我用很多字符串測試過它。我還有另一個系統運行windows和一個名爲Docklight的軟件。該軟件給我十六進制字節,我需要在我的應用程序中接收它。 十六進制字節是象下面這樣:無法在C中打印十六進制字節

FF AA 2E 0F CC 0D

我已連接兩者經由串行通信電纜的系統。現在要打印十六進制字節,我們需要在printf語句中包含%02X。這樣做,它給了我一個format ‘%X’ expects argument of type ‘unsigned int’, but argument 2 has type ‘unsigned char *’的警告。我搜索了這個,並用%p代替它。下面是代碼:

unsigned char buf[255]; 

res = read(fd,buf,255); 
buf[res]='\0'; 

printf("data: %p\n",buf); 

的printf語句的輸出是data: 0x603380。我打開BUF變量,看看哪些是下面的精確值:

Name : buf 
Details:"ÿª.\017Ì\n", '\0' <repeats 248 times> 
Default:0x603380 <buf> 
Decimal:6304640 
Hex:0x603380 
Binary:11000000011001110000000 
Octal:030031600 

現在我真的不知道爲什麼會出現隨機字符,如ÿª.\017Ì\n中的printf的輸出是可能是因爲它結合了所有字節合併爲一個並顯示其十六進制等值。

我實際上需要將像FFAA這樣的每個字節保存在一個數組中。但就目前而言,我首先想到了它。可能是什麼問題。爲什麼它不顯示十六進制字節。任何人都可以給我這方面的建議。我還需要知道,當我們通過串行傳輸十六進制字節時,接收端應該如何接收它。它應該保存爲intstrings。謝謝。!

+2

你的'printf'的輸出是因爲你打印了'buf'的第一個元素的基地址作爲一個依賴於系統的格式*指針*。 [查看'%p'作爲'printf'的格式說明符。](http://en.cppreference.com/w/c/io/fprintf)。總之,它不會做你認爲它所做的事情。你需要一個*循環*。而且,你的'buf'只能從0..254索引。如果這個'read'調用完全填充255個八位字節,那麼在後續行中的不必要的終止符放置將調用*未定義的行爲*。 – WhozCraig

+0

@WhozCraig好的。你的意思是我需要一個循環並分別轉換每個字節並將它們保存在緩衝區中。 –

+1

'對(INT I = 0; I <水庫;我++)printf的[ 「%02X」,BUF [I]); printf(「\ n」);'順着你的緩衝區已經包含那個valkues,你不需要轉換它們。你對printf的處理是用ASCII格式將其打印出來。 – LPs

回答

5

這是一個基本的C問題,你給printf()一個指針,並期待它顯示你的十六進制轉儲,就好像它是一個字符串。這不是它的工作方式。

你應該做這樣的事情:

unsigned char buf[255]; 

res = read(fd,buf,255); 
// AN HEX BUFFER IS NOT A STRING DO NOT TERMINATE IT 
// buf[res]='\0'; 

printf("data: "); 
for (int i = 0; i < res; ++i) 
    printf("%02x ", (int)buf[i]); 

printf("\n"); 

的printf的選項%P它用於轉儲指針地址,而不是內容的指針指向。

+0

Thankyou我不知道,如果它包含十六進制字節,我們不需要終止字符串。另外我試圖通過使用sprintf將轉換後的十六進制字節保存到數組中:'unsigned char hexarray [255];對(INT I = 0; I <水庫; ++ⅰ){sprintf的(hexarray [I]中, 「%02X」,BUF [I]);}'但它說的sprintf的參數1,使指針從整數,未投但buf已經是char了。我如何保存在另一個數組 –

+0

一兩件事,printf的輸出是'FF AA 2E 0F CC 0A'轉換的十六進制值。它應該是'FF AA 2E 0F CC 0D'。最後一個字節中的0D正在轉換。 –

+0

我認爲問題在於換行類型,在傳輸之前和之後都可能在串行通信中將\ r(0x0d)轉換爲\ n(0x0a)。如果發件人是確定的窗口。 – gabry

3
printf("data: %p\n",buf); 

這是印刷變量BUF的地址,因爲你已經使用%P 要顯示在十六進制BUF,你需要通過字符

printf("data: %.2X\n",buf[i]);// i from 0 to res 

將其打印在循環字符「我真的需要將每個字節像FF和AA保存在一個數組中。「 它已經在你的陣列即蟾蜍,你需要打印正確,如果你想顯示在十六進制

+0

我不想顯示。我需要將正確格式的十六進制字節保存在一個數組中。以後我可以使用數組元素。 –