【发布时间】:2021-06-14 21:39:25
【问题描述】:
我有一组存储在相对较大类型的变量中的值,我必须再次将其存储在相对较小的变量中。
这里是问题的故事:我有不同类型的不同传感器值,例如 uint16_t、uint32_t 和 float。我想将值存储在 uint8_t 缓冲区数组中以通过射频发射器进行传输。对于浮点类型,我接受一个有限有效值,然后使用整数乘法将其存储在一个整数变量中。像这样:
对于这个例子,我想要逗号后面的 3 位数字,
float var1 = 12.3456789;
uint16_t var2;
var1 *= 1000;
var2 = (int) var1;
它给出了输出:
Var2: 12345 , Var1: 12345.679688
问题的总结可以如图所示,
黑框是 32 字节缓冲区中的 uint8_t 类型元素,橙色框是 uint16_t 变量,我想将其分成两个 uint8_t 变量。
我尝试使用 memcpy() 作为,
#include <stdio.h>
#include <stdint.h>
#include <string.h>
int main() {
uint8_t buffer[32];
uint16_t var1 = 64000;
memcpy(&buffer[0], &var1, 1);
memcpy(&buffer[1], &var1 + 1, 1);
printf("var1: 0x%x\n\rbuffer[0]: 0x%x\n\rbuffer[1]: 0x%x", var1, buffer[0], buffer[1]);
return 0;
}
它给出了输出:
var1: 0xfa00
buffer[0]: 0x0
buffer[1]: 0x0
我曾想过使用按位运算符以某种方式分离,但失败了。如果您对此问题有任何可能的解决方案,那就太好了。
【问题讨论】:
-
memcpy(&buffer[0], &var1, 2);呢? -
一个简单的方法,从来没有这样。对,数组只是在内存中排列,将 2 个字节复制到第一个元素中即可解决。谢谢!
-
您可以使用按位运算符从 32 位中提取每个字节。来源bitwise
标签: c