代码之家  ›  专栏  ›  技术社区  ›  fUrious

如何将unsigned int转换为unsigned char

  •  3
  • fUrious  · 技术社区  · 8 年前

    我正在试着将一个数字传感器模块连接到ARM Cortex M4F芯片上。

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

    所以我把这个值读为:

    uint32_t value = mcu_read(pin);
    

    value 现在包含一个 uint32_t ,4字节。我需要前三个。有没有可能以任何方式改变它来“提取”它们? 这有道理吗?showStopper是MCU读取函数,它至少读取4个字节。如果在那里 uint8_t read函数我可以调用它三次来获取所需的数据。

    3 回复  |  直到 8 年前
        1
  •  3
  •   babu646    8 年前

    像这样的?

    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];
    

    小心菊苣

        2
  •  8
  •   VLL Mohamed El-Nakeep    8 年前

    您可以使用 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;
    
        3
  •  1
  •   Daniel    8 年前
    #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