Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
memcpy的替代方案_C_Pointers_Floating Point_Arduino_Memcpy - Fatal编程技术网

memcpy的替代方案

memcpy的替代方案,c,pointers,floating-point,arduino,memcpy,C,Pointers,Floating Point,Arduino,Memcpy,我正在使用Arduino解析从本地网络上的应用程序发送的UDP包。这些消息包含36字节的信息。前四个字节表示一个(单精度)浮点,后四个字节表示另一个,以此类推 Arduino函数udp.read()将数据读取为字符,最后生成一个数组 char data[36] = { ... }; 我现在正在寻找一种方法,将其转换为相应的九个浮点数。我找到的唯一解决办法是反复使用这个技巧: float f; char b[] = {data[0], data[1], data[2], data[3]}; me

我正在使用Arduino解析从本地网络上的应用程序发送的UDP包。这些消息包含36字节的信息。前四个字节表示一个(单精度)浮点,后四个字节表示另一个,以此类推

Arduino函数udp.read()将数据读取为字符,最后生成一个数组

char data[36] = { ... };
我现在正在寻找一种方法,将其转换为相应的九个浮点数。我找到的唯一解决办法是反复使用这个技巧:

float f;
char b[] = {data[0], data[1], data[2], data[3]};
memcpy(&f, &b, sizeof(f));
不过,我相信一定有更好的办法。我是否可以不用复制内存块,而只使用指针,然后告诉C将b解释为浮点数


谢谢

这很危险,而且技术上没有很好的定义,而且你做这件事的方式更好

也就是说,在某些平台上,您可以侥幸逃脱:

float *f1 = (float *)data;
float *f2 = (float *)(data + 4);


另外,在您的代码中,我看不出有任何理由不直接从
数据+偏移量
读取
memcpy
,您可以直接读取缓冲区

union Data
{
   char  data[36];
   float f[9];
};


union Data data;
data.data[0] = 0;
data.data[1] = 0;
data.data[2] = 0;
data.data[3] = 0;

fprintf(stdout,"float is %f\n",data.float[0]);
float data[9];
udp.read((char*)data, sizeof(data));

您认为您显示的代码片段有哪些未定义的内容?@delnan特定的实现可能有一些特性,例如,为浮点数据留出一些存储空间,为其他数据留出一些“通用”存储空间。当你把一个
float*
指向通用存储时,你可能会很开心。谢谢!那正是我想要的。我试着用同样的方法,但不知怎的,我把指针弄乱了。感谢memcpy提示;我以前从未使用过这个函数。@delnan:是的,这就是这里发生的事情
data
是一个
char
数组,作为
float
数组访问。这是非法的,但你可以用另一种方法——你可以通过
char*
@delnan访问
float
数组:你的内存是正确的。查看n1124,6.5第6点定义了“有效类型”,6.5第7点规定,如果您访问的对象的类型不兼容且不是char,则会出现未定义的行为。为什么不进行并集以将char数组与float数组对齐?@Jim您能提供一些详细信息吗?我是C语言的新手,所以我不习惯这种低级的东西。谢谢。我刚刚发布了一个答案。请注意
memcpy(&f,b,sizeof)
是唯一一个没有对对齐/填充进行任何假设的解决方案。对于解包网络数据包和二进制文件格式,这是一种方法。对于所有这些解决方案,请确保发送应用程序使用与Arduino相同的浮点表示形式。谢谢。我以前没听说过工会。真是个聪明的小东西!它真的很旧了。人们不再经常使用它了。对于int到bit也很有用。