[英]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
),這很容易檢查,打印等等......然后轉換那個二進制值到另一個不同格式的字符串。 請參閱任何手冊或在線文檔。 我相信strtol
和ltoa
會做你需要的。
如果函數內的代碼是正確的,那么該函數被錯誤命名。 它確實看起來很業余,但可以想象它打算讀取一系列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 16 ( 0x74
),即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.