数据类型转换

STM32中各种格式的长度

  1. Byte:8位 即uint8_t
  2. unsigned short(WORD):16位 即uint16_t
  3. unsigned int(DWORD):32位 即uint32_t
  4. unsigned long: 32位 即uint32_t

下面转换思路,采用联合体结构,利用了联合体的特性,即内部的类型是共享同一个地址的。

1、字节转字

BYTE<—>WORD 8位变16位
定义一个联合体:

typedef union tagW2BY
    WORD wValue; //一个字
    BYTE byDst[2]; //两个字节
}tagBY2W;
void BY2W(BYTE* bySrc, WORD* wDst)
    tagBY2W uTag;
    //将字节的值复制到Word上 
    memcpy(uTag.byDst, bySrc, sizeof(WORD));
    //输出Word的值
    *wDst = uTag.wValue;
void W2BY(WORD wSrc, BYTE* byDst)
    tagBY2W uTag;
    //将Word的值复制到联合体中
    uTag.wValue = wSrc;
    //将值通过指针输出
    memcpy(byDst, uTag.byDst, sizeof(WORD));

同理WORD与DWORD转换也使用一个联合体

typedef union tagW2DW
    DWORD dwValue;
    WORD  wDst[2];
}tagDW2W;

上面的这个这种转换是利用了union里面的各类型的地址一样,但是其中也存在一个问题就是,从WORD、DWORD转换到BYTE中,会受到目标主机的存储格式的影响,譬如在STM32 中,WORD、DWORD的存储是按小段模式存储的,即低地址放数据低位,高地址放数据高位(详看单片机存储中的大小端模式)。这个会反映到BYTE 数据里面。这个是要注意的事项。

首先定义一个uint8_t类型数组长度为2的uint8_t buf[2]; 而用buf[0]跟buf[1]组合表示1个int16_t的short类型数据. uint8_t类型的buf[0]跟buf[1]组成int16_t的short类型(-32768~32767) 1. 当buf[0] = 0;buf[1] = 1; short的数值为256 2. 当buf[0] = 0;buf[1] = 2; short的数值为512 3. 当buf[0] = 1;buf[1] = 0; short的 uint8_t / uint16_t / uint32_t /uint64_t 都是别名,c语言中有哪些数据类型?怎么样取别名 在C语言中有6种基本数据类型:shortint、long、float、double、char 1、数值类型 1)整型:shortint、long 2)浮点型:float、double 2、字符类型:char 二、使用 typedef 猛然一看有点看不懂,可能因为美观原因,源码把它分开写了,实际红色框的是一个整体,是对这个整体取别名,同一个数据类型可以有多个别名,就像在导师叫我 1、 stm32需要告知ros端 imu和速度信息 发送数据结构体变量,数据主要是包括imu信息和速度信息 /*****用于存放陀螺仪加速度计三轴数据结构体**************** 这些数据类型来自于C语言的标准头文件stdint.h。在这个头文件中,定义了一系列固定宽度的整数类型,以确保在不同平台上数据类型的大小是一致的。这种固定宽度的整数类型对于需要确保位宽和大小一致性的底层编程任务非常重要。在stdint.h头文件中,这些数据类型的定义通常是通过使用 typedef 关键字来实现的,将已有的基本整数类型重新定义为特定宽度的无符号整数类型。// 8位无符号整数类型// 16位无符号整数类型// 32位无符号整数类型// 64位无符号整数类型。 // The C Standard Library <stdint.h> header. #pragma once #define _STDINT #include <vcruntime.h> #if _VCRT_COMPILER_PREPROCESSOR #pragma warning(push) 根据文档的解释:Uint8Array 数组类型表示一个8位无符号整型数组,创建时内容被初始化为0。创建完后,可以以对象的方式或使用数组下标索引的方式引用数组中的元素 2、在JS中遇到Uint8Array 的场景 js调用动态库,动态库由c语言编写,并且里面的方法使用了指针、int、double等js所没有的概念。 那么在使用动态库时,需要使用ref、ref-array等库来进行转换。 例如使用一个double类型数组的指针 var doubleArray = refArray(ref.types. short tmp_value; uint8_t *index_1, *index_2; index_1 = (uint8_t *)&amp;amp;amp;tmp_value; index_2 = (uint8_t *)&amp;amp;amp;value; *index_1 = *(index_2+1);... 最近在STM32单片机操作中,常常需要通过UART,I2C,USB等端口发送各种传感器的数据,这些传感器寄存器大多是32位或者16位的。HAL库中发送函数都是8位指针结构,不能直接发送不同类型的数据,这就需要把不同长度及类型的数据转换成uint8_t 无符号8位整型。现总结两种方法,如下: /*******************************************...