绝了,还能这么转化十六进制字符串-C语言骚操作

来源:公众号【鱼鹰谈单片机】

作者:鱼鹰Osprey

前段时间移植了 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" 写了两次,但内存中只有一份拷贝,因此并不会占用更多空间,并且因为使用索引形式,效率也是杠杠滴!

嗯,以后十六进制转化就用这个代码了。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 1
收藏 4
关注 151
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧