C语言 uint8 类型的数组,如何使用指针访问四字节读取数据,保存到uint32类型的数据中
在C语言中,uint8_t
类型的数组代表无符号单字节整数数组。如果需要通过指针访问并读取四个连续的字节来构建一个uint32_t
(即无符号32位整数),你可以这样做:
首先,假设我们有一个名为byte_array
的uint8_t
数组,其长度至少为4:
uint8_t byte_array[4];
然后,我们可以创建一个指向这个数组的指针,通常命名为ptr
:
uint8_t *ptr = byte_array;
接着,为了读取这四个字节,可以将它们按照大端模式(Little Endian在现代大多数系统中是默认的,但以防万一)逐字节复制到一个uint32_t
变量uint32_data
中:
union {
uint32_t value;
uint8_t bytes[4];
} data;
data.bytes[0] = *(ptr++);
data.bytes[1] = *(ptr++);
data.bytes[2] = *(ptr++);
data.bytes[3] = *(ptr++);
// 现在,data.value包含了从byte_array读取的uint32_t值
这里使用了联合体(union)来同时表示一个uint32_t
值和它的字节表示。因为联合体中的所有成员共享相同的内存空间,所以可以直接对字节进行操作。
写一个基于c语言的字节流转换函数 输入是void* 类型任意大小,输出是uint8_t类型的数组,并返回转换后uint8_t数组的大小
在C语言中,你可以创建一个函数来处理这种字节流转换,通常通过指针操作完成。下面是一个简单的示例函数,它假设输入的void*指针指向的是连续的数据块,可以逐字节读取并转换为uint8_t数组:
#include <stdint.h>
size_t convert_byte_stream(void* input_data, uint8_t* output_array) {
size_t in_size = sizeof(void*);
while (in_size > 0) {
uint8_t byte = *((uint8_t*)input_data);
*output_array++ = byte;
input_data += sizeof(uint8_t);
in_size - (uint8_t*)output_array); // 返回实际转换后的字节数
}
// 示例用法:
void* data = ...; // 你的原始数据
size_t data_size = ...; // 数据的实际大小
uint8_t byte_array[data_size];
size_t converted_size = convert_byte_stream(data, byte_array);
这个函数会遍历输入的void*数据,每次取出一个字节,将其复制到输出数组中,直到所有输入字节都被处理完毕。注意,这仅适用于输入数据确实是字节级别的连续数据。
STM32中数据类型
STM32 中支持的数据类型及其定义
基本数据类型
在STM32微控制器的编程环境中,基本数据类型与C语言的标准数据类型一致。以下是常用的几种基本数据类型:
字符型
char
是一种用于存储单个字符的数据类型,通常占用1字节(8位)。它可以是有符号的(signed char)或无符号的(unsigned char)。其取值范围分别为-128 ~ 127
和0 ~ 255
。整型
整型数据类型包括多种大小和符号选项:int
:通常是默认的整数类型,在大多数编译器中占4字节。short
:短整型,一般占2字节。long
:长整型,通常占4字节。long long
:更长的整型,通常占8字节。
无符号整型
使用关键字unsigned
可以声明无符号整型变量,这些变量仅能存储非负数值。例如:unsigned short
占用2字节,范围为0 ~ 65535
[^3]。unsigned int
占用4字节,范围为0 ~ 4294967295
。
带符号整型
使用关键字signed
或省略不写,默认情况下即为带符号整型变量。例如:s8
表示有符号8位整数,范围为-128 ~ 127
。s16
表示有符号16位整数,范围为-32768 ~ 32767
。
扩展数据类型
为了增强代码的可移植性和一致性,STM32库文件中常使用 <stdint.h>
头文件来定义标准化的数据类型名称。以下是一些常见的扩展数据类型:
固定宽度整型
int8_t
/uint8_t
:分别对应有符号和无符号8位整数。int16_t
/uint16_t
:分别对应有符号和无符号16位整数。int32_t
/uint32_t
:分别对应有符号和无符号32位整数。int64_t
/uint64_t
:分别对应有符号和无符号64位整数。
指针大小相关类型
intptr_t
/uintptr_t
:适用于存储任何有效指针的整数类型。size_t
:表示对象大小的无符号整数类型。ptrdiff_t
:表示两个指针之间差值的带符号整数类型。
浮点型
浮点型数据类型用于处理实数计算,具有更高的精度需求时适用:
float
:单精度浮点数,通常占用4字节,能够精确到小数点后约6~7位数字。double
:双精度浮点数,通常占用8字节,能够精确到小数点后约15位数字。
特殊修饰符
某些特定场景下需要用到特殊的内存访问控制,因此引入了一些额外的关键字修饰符:
_IO
:这是一个宏定义,实际上等价于volatile
关键字,用来标记可能会被外部硬件修改的变量,确保每次读取都直接从内存获取最新值而不是缓存副本[^2]。volatile
:强制编译器忽略优化操作并始终刷新指定位置的内容至寄存器或者反之亦然。
// 示例代码展示如何定义不同类型的变量
#include <stdio.h>
#include <stdint.h>
int main(void){
uint8_t byteVar = 255;
int16_t shortVar = -32768;
uint32_t dwordVar = 4294967295U;
printf("Byte Variable Value:%d\n",byteVar);
printf("Short Integer Variable Value:%d\n",shortVar);
printf("Unsigned Dword Variable Value:%lu\n",(unsigned long)dwordVar);
return 0;
}
以上就是关于STM32所支持的主要数据类型以及它们的具体含义介绍。
相关推荐
















