緣由
這個起因是昨晚群里有人在討論怎么把字符串轉(zhuǎn)成HEX方法最佳,討論到最后變成哪種方法效率最優(yōu)了。畢竟這代碼是要在MCU上面跑的,要同時考慮到時間和空間的最優(yōu)解。
當(dāng)然討論的是有結(jié)果的,具體實現(xiàn)的方法和代碼在下面展示。
char數(shù)組轉(zhuǎn)16進(jìn)制HEX串
例子:
將如下的量
char str[] = "12345";char data[] = {1,2,3,4,5,0xff}; 轉(zhuǎn)成
"313233343500""0102030405FF" 這樣的結(jié)果
這個其實很簡單,追求速度的話,查表就好了
從0-16對應(yīng)0-F即可:
constcharhex_table[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 然后一個個從表里取出來,拼到對應(yīng)位置即可:
void to_hex(char *s, int l, char *d){ while(l--) { *(d+2*l+1) = hex_table[(*(s+l))&0x0f]; *(d+2*l) = hex_table[(*(s+l))>>4]; }} 完整測試代碼如下:
#include
16進(jìn)制HEX串轉(zhuǎn)成數(shù)值數(shù)組
例子:
將類似"AAbb2fFF"的量轉(zhuǎn)成{0xAA,0xBB,0x2F,0xff}這樣的結(jié)果
這里如果還用查表的話,這個rom占用會浪費(fèi)掉不少空間,所有查表法直接就被否決掉了(如果是PC上,追求極致速度的話,當(dāng)然可以用)。
同時,為了通用性,代碼需要兼容大小寫兩種輸入數(shù)據(jù)
在仔細(xì)研究數(shù)據(jù)的結(jié)構(gòu)時,我發(fā)現(xiàn)了個規(guī)律:
ASCII中的0-9對應(yīng)了0x30-0x39
ASCII中的A-F對應(yīng)了0x41-0x46
ASCII中的a-f對應(yīng)了0x61-0x66
也就是說,只要這一個字符大于0x39,那它一定是字母;同時,在上面的分析也可以發(fā)現(xiàn),如果這個字符是字母,不論大寫小寫,只需要看低四位就可以直接判斷這個字符代表的數(shù)是多少
具體邏輯如下:
判斷這個字符是否大于0x39
如果不是,直接取這個字符的低四位當(dāng)作結(jié)果
如果是,則為字母,將他的低四位加上9即為所需結(jié)果
具體實現(xiàn)代碼也如下:
void from_hex(char *s, int l, char *d){ while(l--) { char* p = s+l; char* p2 = p-1; *(d+l/2) = ( (*p>'9'? *p+9 : *p) & 0x0f ) | ( (*p2>'9'? *p2+9 : *p2) << 4 ); l--; }}? 完整的測試代碼
#include
-
mcu
+關(guān)注
關(guān)注
146文章
17359瀏覽量
352832 -
代碼
+關(guān)注
關(guān)注
30文章
4838瀏覽量
69136 -
16進(jìn)制
+關(guān)注
關(guān)注
1文章
13瀏覽量
8822
原文標(biāo)題:太巧妙了!適合 MCU 用的 C語言 快速互轉(zhuǎn) HEX (16進(jìn)制) 方法!
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
字符串與字符數(shù)組的區(qū)別
數(shù)組的下標(biāo)為什么可以是負(fù)數(shù)
指針數(shù)組和二維數(shù)組有沒有區(qū)別
hex格式和二進(jìn)制的區(qū)別
base64字符串轉(zhuǎn)換為二進(jìn)制文件
labview中浮點數(shù)與十六進(jìn)制字符串相互轉(zhuǎn)化
十進(jìn)制數(shù)據(jù)轉(zhuǎn)十六進(jìn)制字符_轉(zhuǎn)ASCII碼
labview字符串數(shù)組轉(zhuǎn)化為數(shù)值數(shù)組
labview字符串如何轉(zhuǎn)換為16進(jìn)制字符串
hex文件如何查看原c語言代碼
請問esp32如何將16進(jìn)制字符串轉(zhuǎn)換成base64格式?
esp32中如何將16進(jìn)制的數(shù)據(jù)轉(zhuǎn)換成字符串?
深入探索KUKA KRL中的數(shù)組應(yīng)用
![深入探索KUKA KRL中的<b class='flag-5'>數(shù)組</b>應(yīng)用](https://file1.elecfans.com/web2/M00/CC/61/wKgZomYgh_6AQodBAAAc_c8kLRY926.png)
評論