如何将 uint16_t 数字转换为 ASCII HEX?

How to convert uint16_t number to ASCII HEX?

将无符号 16 位整数转换为 ASCII HEX 的最佳方法是什么?我正在尝试将我的 Arduino 与串行通信协议集成,该协议期望有效负载为 2 字节 ASCII HEX 值的数组。我希望能够将 HEX 表示的每个字符存储在一个 char 数组中,因为完整的消息(带有开始和停止字符)在传输之前需要进行 CRC 校验和。

例如,要传输十进制值 129,它需要字符串 0081(0x00 和 0x81)。要传输十进制值 35822,它需要一个 8BEE 的字符串。

我主要使用 Python,所以我不太熟悉转换为不同的数据类型。

谢谢!

编辑:我实际上正在使用 Teensy 4.0,只是出于习惯写了 Arduino

static const char *digits = "0123456789ABCDEF";

char *toHex(char *buff, uint16_t val, int withNULL)
{
    buff[0] = digits[(val >> 12)];
    buff[1] = digits[((val >> 8) & 0xf)];
    buff[2] = digits[((val >> 4) & 0xf)];
    buff[3] = digits[(val & 0xf)];
    if(withNULL) buff[4] = 0;
    return buff;
}

char *toHex1(char *buff, uint16_t val, int withNULL)
{
    unsigned char d;
    buff[0] = (char)((d = (val >> 12)) > 9 ? ('A' + d - 10) : ('0' + d));
    buff[1] = (char)((d = ((val >> 8) & 0xf)) > 9 ? ('A' + d - 10) : ('0' + d));
    buff[2] = (char)((d = ((val >> 4) & 0xf)) > 9 ? ('A' + d - 10) : ('0' + d));
    buff[3] = (char)((d = (val & 0xf)) > 9 ? ('A' + d - 10) : ('0' + d));
    if(withNULL) buff[4] = 0;
    return buff;
}