Arduino - 如何将uint16_t转换为Hex

时间:2015-09-15 19:58:31

标签: c++ arduino hex decimal

我目前正在制作草图,将数据发送到3个TLC5971 LED驱动程序。我需要接受uint16_t形式的亮度级别,然后将该值转换为两个8位十六进制数字以传递给LED驱动程序。

示例65535 - > 0xFF0xFF

有没有相对简单的方法呢?我发现了几种返回字符数组的方法,但它们看起来并不容易实现。

有没有人有过做类似事情的经验?

3 个答案:

答案 0 :(得分:3)

试试这个:

uint16_t value;
uint8_t msb = (value & 0xFF00U) >> 8U;
uint8_t lsb = (value & 0x00FFU);

编辑1:
您可能会使问题复杂化并使用结构:

struct MSB_LSB
{
  unsigned int MSB : 8;
  unsigned int LSB : 8;
};
uint16_t value = 0x55aa;
uint8_t msb = ((MSB_LSB)(value)).MSB;
uint8_t lsb = ((MSB_LSB)(value)).LSB;

BTW,十进制,十六进制和八进制是表示的示例。这些陈述是供人类理解的。计算机内部以便于处理器的表示形式存储数字。因此,当您指定十进制数时,编译器会将十进制数转换为更适合处理器的值。我们人类可以用最容易理解的表示形式表示数字。

答案 1 :(得分:1)

uint16_t value = 0x1234;    // Use example with different high/low byte values
unsigned char high_byte = value >> 8;   // = 0x12
unsigned char low_byte = value & 0xFF;  // = 0x34

答案 2 :(得分:0)

使用联合:

typedef union
{
 unsigned short s;
 unsigned char b[2];
} short2bytes_t;

unsigned short value=65535;
unsigned char  MSB, LSB;

short2bytes_t s2b;
s2b.s = value;
MSB=s2b.b[1];
LSB=s2b.b[0];

printf("%d -> 0x%02X 0x%02X\n", value, MSB, LSB);