【问题标题】:How can I convert unsigned int to unsigned char如何将 unsigned int 转换为 unsigned char
【发布时间】:2018-06-25 07:55:22
【问题描述】:

我正在尝试将数字传感器模块连接到 Arm Cortex M4F 芯片。

从模块接收到的数据是 3 个字节。但是,我的 MCU 中唯一可用的功能是 uint32_t 读取功能。我不知道为什么没有 uint8_t 函数,但也许这只是移位的问题?我正在学习 c++。

所以我将值读为:

uint32_t value = mcu_read(pin);

value 现在包含一个 uint32_t,4 个字节。我需要前三个。是否有可能以任何方式将其“提取”出来? 这有意义吗? showstopper 是最少读取 4 个字节的 mcu_read 函数。如果有一个uint8_t 读取函数,我可以调用它三次来获取我需要的数据。

【问题讨论】:

  • 将不感兴趣的字节屏蔽为 0 并将值保存在 uint32_t 中而不是处理 3 个单独的值可能更容易。

标签: c++ microcontroller


【解决方案1】:

你可以用bit shift and logical and提取字节:

uint32_t value = mcu_read(pin);
uint8_t byte_0 = (value >> 24) & 0xFF;
uint8_t byte_1 = (value >> 16) & 0xFF;
uint8_t byte_2 = (value >> 8) & 0xFF;
uint8_t byte_3 = (value) & 0xFF;

【讨论】:

  • 比 c 风格的演员表要好得多。只需在前面添加const auto
  • @Vorac 你对auto 有什么建议?
  • 我的错,算了。
【解决方案2】:

这样的?

uint32_t value = mcu_read(pin);
uint8_t* bytes = (uint8_t*)(&value);
uint8_t byte_0 = bytes[0];
uint8_t byte_1 = bytes[1];
uint8_t byte_2 = bytes[2];
uint8_t byte_3 = bytes[3];

注意字节序

【讨论】:

  • 我没有这么想!
  • 字节序有两个“有趣”的部分——一个字中的字节顺序和一个字节中的位顺序。
  • 如果我没记错的话,这违反了严格的别名规则,因为该例外仅适用于 char 而不是它的别名。
  • @Voo uint8_t 应该是字符类型(标准实际上并没有保证,但它适用于所有存在的实现,实际上这是一个安全的假设)
  • @M.M 与严格的别名规则无关。即使uint8_tchar 相同,它也不会像char 那样被严格别名排除。至少这是我记得的标准的最后一个状态。
【解决方案3】:
#include <stdio.h>
#include <stdint.h>

int main()
{
    uint32_t value = 0xAABBCCDD;
    //-------------------------------
    //byte3 | byte2 | byte1 | byte0 | 
    //-------------------------------
    uint8_t byte_0 = (uint8_t)value; //truncation according to casting rules
    printf("first byte: %x\n",byte_0);
    value>>=8; //right shift will result in the following bytes:
    //-------------------------------
    // garbage | byte3 | byte2 | byte1 | 
    //-------------------------------
    uint8_t byte_1 = (uint8_t)value;
    printf("second byte: %x\n ",byte_1);
    value>>=8;
    //etc...
}

输出:

first byte: dd
second byte: cc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 2022-01-04
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多