如何将unsigned int转换为unsigned char

时间:2018-06-25 07:55:23

标签: c++ microcontroller

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

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

所以我将值读取为:

uint32_t value = mcu_read(pin);

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

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:3)

像这样吗?

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 :(得分:1)

df['new'] = df.groupby('key')['cond'].apply(lambda x: x.shift().bfill().cumsum()).astype(int)

print (df)
  key  cond  new
0   A     1    1
1   A     1    2
2   B     1    1
3   B     0    2
4   A     0    3
5   A     1    3
6   B     1    2

输出:

#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...
}