在工控通訊中經常用到16進製制和ascii碼字元陣列互相轉換的功能,雖然功能簡單,但初學者寫出來的**經常會有各種問題。從16進製制轉為ascii嗎的功能函式,乙個比較簡潔的實現版本如下:
void hextoascii( char * dest, char * src, int srclen )
}在以上短短幾行**裡,基礎比較紮實的同學比較容易發現的乙個bug是用signed char來處理二進位制資料,這樣當被處理的位元組src[i]是負數時就會出現錯誤的轉換結果。同樣把hihalf和lohalf宣告為int,也是有相同bug的。解決辦法是先把src[i]轉為unsigned char,並且把hihalf和lohalf定義為unsigned char。
乙個比較隱蔽的嚴重問題是當dest和src字元陣列有重疊的位址空間時,轉換結果也會不對。例如dest和src的位址相等時,src[0]轉換為dest[0]和dest[1]後,src[1]被dest[1]覆蓋,src[1]還沒轉換裡面的資料已經不是原來的資料了,依次類推。
除此以外,傳進來的指標dest和src都要先判斷是否等於null,這樣才能盡量保證寫出安全的**。
最後一點,最好把dest和src宣告為void *型別的指標,這樣對非char型別的資料呼叫此函式時,就不需要強制轉化。
修正後的**如下:
void hextoascii( void * destbuf, void * srcbuf, int srclen )
unsigned char * dest = (unsigned char *) destbuf;
unsigned char * src = (unsigned char *) srcbuf;
int destpos = srclen << 1;
int srcpos = srclen;
while ( --srcpos >= 0 )
}有興趣的同學可以寫個單元測試驗證一下轉化結果。或者改用查表法來轉化,省去一些計算步驟。
十二進位制轉二進位制 2018
1 逐個輸出對應的十進位制,用空格隔開 高位到地位 10 2 輸出對應的十進位制數 10 3 轉為二進位制,用4個位元組表示 10 例如 輸入a2 輸出 10 2 12200000000 00000000 00000000 01111010 思路 1 利用transfer char ch 將單個字元...
十進位制轉二進位制(C
十進位制轉換二進位制其實不是個複雜的問題,我們首先搞清楚原理 整數部分 如果不是0,不斷除2,直到除到1為止,得到的餘數最後逆向排列輸出 如果是0,直接輸出 小數部分 小數部分m非0,則不斷乘2,如果2 m超過1,則輸出1,m 2 m 1 如果2 m不超過1,m 2 m 由於很多小數是無法完全轉換為...
十進位制轉二進位制(C )
相信大家應該都知道,十進位制轉k進製的方法常用的就是除k取餘的方法,這裡針對這個方法,給出了c 的 需要注意的是,除二取餘的方法,對於餘數的選取是從後往前取的,所以在 中,也要解決這個問題才行。模仿不停地除2的過程,每次除2之後用 取餘數i 用 作為下一次除2的被除數temp j初始化為1,每次除了...