2012-06-18 78 views
1

我期待到一個字節數組轉換爲這裏的十六進制字符串的方法的轉換陣列是我的編碼:字節在純舊的C十六進制字符串

unsigned char buffer[] = {0xAA,0xBB,0x01,0xAB,0x11,0x12,0x13,0x22,0x11,0x14}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 

       char * asta = (char*)malloc(16); 
       memset(asta,0,16); 
       int k; 
       for (k = 0; k < 16 ; k++) 
       { 
        sprintf(&asta[k],"%X",buffer[4 + k]); 
       } 

       printf("%s",asta); 

    _getch(); 
} 

只有第一個字節正確轉換休息不是。我如何修復代碼?

+3

'buffer'只有10個元素,你界訪問的。 –

+3

1. 16個字節對於10個十六進制數是不夠的; 2.你永遠不會釋放記憶; 3.每個十六進制數字需要2個字節。 – pmg

+0

@DanielFischer如果你指向正確的方向,我將能夠修改它的代碼不會從其他原因工作。我不認爲我使用sprintf好! – opc0de

回答

1

您必須記住,當您將其打印爲字符串時,兩位十六進制數字仍然是兩位數字,即它將佔用兩個字符。

在循環中,第二次迭代將覆蓋字符串的第二個字符,第三次迭代將覆蓋第三字符等

而且,因爲每個兩位數將使用兩個字符,則必須爲32個字符分配內存,一個用於字符串終止'\0'字符。

正如評論中所述,您正在訪問陣列之外的數據。

+0

此外,他應該使用格式字符串「%02X」而不是%X進行轉換,否則會有一些字節僅轉換爲十六進制數字,只有一位數字,這會在您想從十六進制轉換爲二進制。 – nos

3

您的數組中有10個字節,因此您的緩衝區至少需要21個字節(每個字節需要2個十六進制數字+ 1個空終止符)。

我不明白你在做什麼,在這裏:

sprintf(&asta[k],"%X",buffer[4 + k]); 

你爲什麼要在緩衝區中的第五個字節開始?另外,緩衝區中的每個字節都需要兩個字節,因此您需要打印到asta[2 * k]

將其組合在一起你喜歡的東西:

char * asta = (char*)calloc(2 * sizeof buffer + 1, sizeof(char)); // calloc automatically zeros asta 
int k; 
for (k = 0; k < sizeof buffer ; k++) 
{ 
    sprintf(&asta[2 * k],"%02X", (unsigned int)buffer[k]); // Not sure if the cast is needed 
} 
printf("%s",asta); 
相關問題