2012-02-10 72 views
2

這裏是我的邏輯,以十六進制轉換爲ASCII的轉換在C:十六進制ASCII碼在C

for (i=0;i<ArraySize;i++) 
    { 
     /*uses a bitwise AND to take the top 4 bits from the byte, 
     0xF0 is 11110000 in binary*/ 
     char1 = Tmp[i] & 0xf0; 
     char1 = char1 >> 4; 
     /*bit-shift the result to the right by four bits (i.e. quickly divides by 16)*/ 
     if (char1 >9) 
     { 
      char1 = char1 - 0xa; 
      char1 = char1 + 'A'; 
     } 
     else 
     char1 = char1 + '0'; 
     Loc[j]=char1; 
     j++; 
     /*means use a bitwise AND to take the bottom four bits from the byte, 
     0x0F is 00001111 in binary*/ 
     char1 = Tmp[i] & 0x0f; 
     if (char1 >9) 
     { 
      char1 = char1 - 0xa; 
      char1 = char1 + 'A'; 
     } 
     else 
     char1 = char1 + '0'; 
     Loc[j]=char1; 
     j++; 
     Loc[j]=0; 
    } 

溫度和LOC的字符串緩衝區。定義並有數據。它工作不正常。我正在從一些文件(樣本fread)讀取temp中的數據。它停止在特定點閱讀文件。如果我改變第一

0XF0

爲0x0F

這裏是如何的文件正在讀取:

BytesRead = fread (Tmp,1,Bytes,PrcFile); 

然後它讀取整個文件。我無法找到遺漏的東西。在這方面你能幫助我嗎? 感謝

+0

你能證明確實的文件讀/寫的代碼?該算法看起來正確。 – 2012-02-10 11:46:51

+0

看起來更像是一個BIN到HEX(ASCII)的轉換。 – Till 2012-02-10 11:47:20

+0

添加讀取文件和構建數組的代碼。 – 2012-02-10 11:47:47

回答

2

這不是一個答案,但觀察 - 使用這個,因爲它的格式代碼

static char lookup[] = { '0', '1', '2','3','4','5','6','7','8','9','A','B','C','D','E','F' }; 
int j = 0; 
for (i=0; i<ArraySize; ++i) 
{ 
    loc[j++] = lookup[(Tmp[i] & 0xf0) >> 4]; 
    loc[j++] = lookup[Tmp[i] & 0xf]; 
} 
loc[j] = 0; 

使代碼快了很多,更簡單。

+0

謝謝Ed的輸入。讓我這樣做,可能會有所改變。 – QMG 2012-02-10 11:59:17

+1

哦 - 確保loc的長度是(至少)2 * ArraySize + 1 – 2012-02-10 12:04:06

0

即使愛德已經提供了一個較短的解決方案,我試圖找出什麼是錯的,因爲你的代碼「看起來」是正確的。

讓我猜猜:char1是有符號的(例如鍵入「char」)。

然後,它會發生,即:

  • 在文件中的字節是> 127時&0xf0保持它的標誌,

  • >> 4是有符號轉變,這使得該位模式保持在最高有效位中設置的位

  • 然後你比較>9這不是這種情況,因爲符號位仍然設置爲

  • 然後你添加+'0'現在可以導致你有一個值爲0的字節而不是 '0' - '9'或'A' - 'F'之間的東西。

  • 終止字符串,而打印

+0

我假設讀取的數據是無符號字符。 – 2012-02-10 12:15:56

+0

是的,這似乎是問題所在。試一試你的代碼,把'char1'的聲明改爲'unsigned char'。 – 2012-02-10 12:23:13

+0

我試圖在不同的文件上運行它,但它從文件中讀取相同數量的字節並停止。無論文件大小是30 K還是100K – QMG 2012-02-10 12:23:48