如何将uint16_t类型数字转换为ASCII HEX格式?
16位无符号整数转ASCII HEX(Teensy 4.0场景)最优实现方案
核心需求对齐
你需要的是16位无符号整数固定输出4位HEX格式ASCII字符,自动补前导零,结果直接存入char数组供后续拼接报文、计算CRC使用,以下是不同场景的最优实现:
Teensy/Arduino 嵌入式端实现
优先推荐查表法,是嵌入式场景下效率最高的方案,无分支运算、执行时间固定,完全适配实时通信需求:
// 16进制字符查找表,存储在Flash中不占用RAM,如需小写HEX可替换为abcdef static const char HEX_TABLE[] = "0123456789ABCDEF"; /** * @param value 输入16位无符号整数 * @param out_buf 输出数组,需提前分配至少4字节的char空间 */ void uint16_to_ascii_hex(uint16_t value, char *out_buf) { out_buf[0] = HEX_TABLE[(value >> 12) & 0x0F]; // 取最高4位对应字符 out_buf[1] = HEX_TABLE[(value >> 8) & 0x0F]; // 次高4位对应字符 out_buf[2] = HEX_TABLE[(value >> 4) & 0x0F]; // 次低4位对应字符 out_buf[3] = HEX_TABLE[value & 0x0F]; // 最低4位对应字符 }
调用示例:
uint16_t val = 129; char payload_buf[4]; uint16_to_ascii_hex(val, payload_buf); // 此时payload_buf内容为 ['0','0','8','1'],完全符合协议要求
如果对性能要求不高,也可以用内置格式化函数实现,代码更简洁:
char hex_buf[5]; // 多1字节存储字符串结束符 sprintf(hex_buf, "%04X", 35822); // hex_buf[0]-hex_buf[3]即为 ['8','B','E','E']
该方案的优势:
- 执行效率远高于分支判断转换的实现,无执行时间抖动
- 自动补前导零,无需额外做长度判断处理
- 输出直接是char类型数组,可直接拷贝到报文的payload段用于CRC计算
Python 参考实现(调试验证用)
你熟悉的Python环境下可以用以下逻辑快速验证转换结果:
def uint16_to_ascii_hex(value: int) -> str: # 自动截断为16位,输出4位大写HEX,补前导零 return f"{value & 0xFFFF:04X}"
测试结果:
- 输入129输出
0081 - 输入35822输出
8BEE,和你给出的示例完全匹配
注意事项
- 若协议要求小写HEX格式,只需将查找表的大写字母替换为小写,或格式化参数改为
%04x(C++)/:04x(Python)即可 - 拼接完整报文时直接将生成的4个char按顺序填入payload位置即可,无需额外类型转换
内容的提问来源于stack exchange,提问作者popc0rnx
相关产品推荐
相关产品推荐

