來(lái)源:公眾號(hào)【魚鷹談單片機(jī)】
作者:魚鷹Osprey
ID :emOsprey
前段時(shí)間移植了 tinyUSB 開(kāi)源庫(kù),使 STM32F013C8T6 成功模擬了 7 個(gè)串口 獨(dú)立的 CDC 設(shè)備(參考了知乎上一篇文章,不過(guò)那個(gè)實(shí)現(xiàn)還有一些問(wèn)題,并且不能單獨(dú)設(shè)置每個(gè)串口的波特率)。
后面又移植了 lwip ,成功實(shí)現(xiàn)了虛擬網(wǎng)絡(luò)適配器:

于是準(zhǔn)備看看源碼實(shí)現(xiàn),突然發(fā)現(xiàn)一條看不懂的代碼:
_desc_str[1+chr_count++] = "0123456789ABCDEF"[(tud_network_mac_address[i] >> 4) & 0xf];
乍看一下,字符串不像字符串,數(shù)組也不像,直到看到說(shuō)明,才大概明白,運(yùn)行之后,顛覆三觀了。。。
完整代碼如下:
static uint16_t _desc_str[32 + 1];
unsigned int chr_count = 0;
uint8_t tud_network_mac_address[6] = {0x02,0x02,0x84,0x6A,0x96,0x00};
// Convert MAC address into UTF-16
for (unsigned i=0; i> 4) & 0xf];
_desc_str[1+chr_count++] = "0123456789ABCDEF"[(tud_network_mac_address[i] >> 0) & 0xf];
}
功能就是將 mac 地址轉(zhuǎn)化為 16 進(jìn)制,并且還是 utf-16格式(16 bit 一個(gè)字符)
最終轉(zhuǎn)化效果如下(16bit 和字符串顯示):

并且雖然"0123456789ABCDEF" 寫了兩次,但內(nèi)存中只有一份拷貝,因此并不會(huì)占用更多空間,并且因?yàn)槭褂?a target="_blank">索引形式,效率也是杠杠滴!

嗯,以后十六進(jìn)制轉(zhuǎn)化就用這個(gè)代碼了。
審核編輯:湯梓紅
-
C語(yǔ)言
+關(guān)注
關(guān)注
183文章
7634瀏覽量
144197 -
串口
+關(guān)注
關(guān)注
15文章
1602瀏覽量
81589 -
字符串
+關(guān)注
關(guān)注
1文章
594瀏覽量
22967 -
十六進(jìn)制
+關(guān)注
關(guān)注
2文章
32瀏覽量
38781
原文標(biāo)題:絕了,還能這么轉(zhuǎn)化十六進(jìn)制字符串-C語(yǔ)言騷操作
文章出處:【微信號(hào):emOsprey,微信公眾號(hào):魚鷹談單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
labview中浮點(diǎn)數(shù)與十六進(jìn)制字符串相互轉(zhuǎn)化
十六進(jìn)制數(shù)字符串至數(shù)值轉(zhuǎn)換的問(wèn)題
字符串顯示轉(zhuǎn)換十六進(jìn)制顯示
字符串十進(jìn)制轉(zhuǎn)十六進(jìn)制
二進(jìn)制字符串到十六進(jìn)制字符串轉(zhuǎn)換 拿來(lái)分享
十六進(jìn)制數(shù)字符串至數(shù)值或字符轉(zhuǎn)換的問(wèn)題
十六進(jìn)制顯示的字符串怎么進(jìn)行加法運(yùn)算
Labview十進(jìn)制數(shù)據(jù)轉(zhuǎn)化成十六進(jìn)制字符串(十六進(jìn)制顯示)
數(shù)據(jù)轉(zhuǎn)換、SQL存儲(chǔ),十六進(jìn)制字符串、正常字符串
二進(jìn)制字符串到十六進(jìn)制字符串轉(zhuǎn)換,十六進(jìn)制字符串顯示為ASCII碼,拿來(lái)分享
stm32十六進(jìn)制字符串轉(zhuǎn)十進(jìn)制數(shù)值代碼

如何轉(zhuǎn)化十六進(jìn)制字符串
評(píng)論