簡體   English   中英

在C中將十六進制轉換為二進制

[英]Convert Hexadecimal to Binary in C

我目前正在維護一個我從之前的開發人員那里繼承的代碼。 我必須理解一個將ID從Hex轉換為Binay的函數。 我不能完全理解他背后的邏輯。 下面是代碼,

int iHex2Bin(char * pchIn, char * pchOut, int iLen)
{
int i;

memset(pchOut, 0, iLen);

for(i=0; i<iLen; i++)
{
    pchOut[i] = (((unsigned char) *pchIn)-0x30)*16;
    pchIn++;
    pchOut[i] += (((unsigned char) *pchIn)-0x30);

    pchIn++;
}
return(0);
}

顧名思義,它將Hex轉換為Bin。 我不明白這個功能的邏輯。 有人能解釋一下嗎? 謝謝。

謝謝你的回答。 現在有點清楚。 我也在添加相反的功能以進行更多分類,

int iBin2Hex(char * pchIn,char * pchOut,int iLen){int i;

unsigned char chInBuff[256]={0};
char chOutBuff[513]={0};
char chTemp[3]={0};

if(iLen>256)
    return(-2);

memcpy(chInBuff, pchIn, iLen);
for(i=0; i<iLen; i++)
{
    sprintf(chTemp, "%02X", chInBuff[i]);
    strcat(chOutBuff, chTemp);
}

memcpy(pchOut, chOutBuff, iLen*2 + 1);
return(SUCCESS);

}

我覺得這個功能是必要的,功能名稱很混亂。 可以使用C庫函數。 但是代碼正確地正在進行,所以我沒有做任何改動。 如果以后需要,我只需要了解代碼。

我不認為這個功能完全按照你所說的去做。 它需要一串字符作為輸入,並產生另一個字符串作為輸出,但我會猶豫將輸入標記為“十六進制”。 輸出是一系列帶有二進制值的有符號字節。

讓我們看一下代碼的核心:表達式(((unsigned char) *pchIn)-0x30) 這將讀取單個字符並減去0x30 ,這是'0'的ASCII值。 因此,此表達式正確地將ASCII數字轉換為0到9之間的值。它無法正確處理任何其他字符。 具體來說,它不會為字符'A''F'產生正確的值10-15,也不會產生'a''f'的正確值10-15。 輸入字符串中的替換字符乘以16 ... no的事實,這不足以使這個十六進制。

基本上它正在做的是取一個(大概是偶數長度)字節串A,B,C,D,......並將其轉換為字節串A * 16 + B,C * 16 + D,......

你最好使用一個標准庫函數將字符串轉換為實際的二進制值(比如一個int ),這很容易檢查,打印等等......然后轉換那個二進制值到另一個不同格式的字符串。 請參閱任何手冊或在線文檔。 我相信strtolltoa會做你需要的。

如果函數內的代碼是正確的,那么該函數被錯誤命名。 它確實看起來很業余,但可以想象它打算讀取一系列ASCII數字(無論C實現的執行字符集是什么)並寫入二進制編碼的十進制數

例如,此例程可用於讀取ASCII中的文本並准備用於使用二進制編碼的十進制的財務軟件。 (目前不使用ASCII的系統並不常見,使用二進制編碼小數的系統或應用程序並不常見,但代碼顯示這兩者的跡象的事實是一些意圖而非意外的證據。)

考慮到這一點,我們可以解釋代碼:

for(i=0; i<iLen; i++)

這對每對輸出數字迭代一次。 因此處理的位數是2*iLen ,寫入的字節數是iLen

    pchOut[i] = (((unsigned char) *pchIn)-0x30)*16;

這從輸入中獲取一個字符,並將ASCII代碼減去“0”。 由於ASCII數字“0”到“9”具有連續的代碼,因此結果是由數字0到9表示的數字。然后將該數字乘以16,實際上是左移,並存儲在當前輸出字節中。

    pchOut[i] += (((unsigned char) *pchIn)-0x30);

這將計算下一個輸入字符表示的數字,並將其添加到當前輸出字節。 結果是兩個數字在一個字節中打包在一起,每個數字以四位編碼。 例如,輸入中的十進制數字“74”將被編碼為74 160x74 ),即116 10

除了別人說的錯誤之外,代碼可以使用下面的代碼將連續的十六進制字符對轉換為一個字節

// inside the loop
pchOut[i] = strtoul((char[3]){pchIn[0], pchIn[1]}, 0,16);
pchIn += 2;

這使用了自C99以來可用的coumpound字面值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM