来源:公众号【鱼鹰谈单片机】
作者:鱼鹰Osprey
ID :emOsprey
前段时间移植了 tinyUSB 开源库,使 STM32F013C8T6 成功模拟了 7 个串口 独立的 CDC 设备(参考了知乎上一篇文章,不过那个实现还有一些问题,并且不能单独设置每个串口的波特率)。
后面又移植了 lwip ,成功实现了虚拟网络适配器:
于是准备看看源码实现,突然发现一条看不懂的代码:
_desc_str[1+chr_count++] = "0123456789ABCDEF"[(tud_network_mac_address[i] 4) & 0xf];
乍看一下,字符串不像字符串,数组也不像,直到看到说明,才大概明白,运行之后,颠覆三观了。。。
完整代码如下:
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<sizeof(tud_network_mac_address); i++) {
_desc_str[1+chr_count++] = "0123456789ABCDEF"[(tud_network_mac_address[i] >> 4) & 0xf];
_desc_str[1+chr_count++] = "0123456789ABCDEF"[(tud_network_mac_address[i] >> 0) & 0xf];
}
功能就是将 mac 地址转化为 16 进制,并且还是 utf-16 格式(16 bit 一个字符)
最终转化效果如下(16bit 和字符串显示):
并且虽然 "0123456789ABCDEF" 写了两次,但内存中只有一份拷贝,因此并不会占用更多空间,并且因为使用索引形式,效率也是杠杠滴!
嗯,以后十六进制转化就用这个代码了。