我试图使一个函数接受一个float变量并将其转换成一个字节数组.我发现一个代码片段可以工作,但是如果可能的话,想在一个函数中重用它.
我也在使用Arduino环境,但我明白它接受大多数C语言.
目前作品:
float_variable = 1.11; byte bytes_array[4]; *((float *)bytes_array) = float_variable;
我可以在这里改变什么来使这个功能起作用?
float float_test = 1.11; byte bytes[4]; // Calling the function float2Bytes(&bytes,float_test); // Function void float2Bytes(byte* bytes_temp[4],float float_variable){ *(float*)bytes_temp = float_variable; }
我不太熟悉指针等等,但是我读到(float)使用的是cast或某些东西?
任何帮助将不胜感激!
干杯
*编辑:解决
这是我在Arduino工作的最终功能,任何人谁找到这个.在下面的答案中有更有效的解决方案,但是我认为这是可以理解的.
功能:将输入的float变量转换为字节数组
void float2Bytes(float val,byte* bytes_array){ // Create union of shared memory space union { float float_variable; byte temp_array[4]; } u; // Overite bytes of union with float variable u.float_variable = val; // Assign bytes to input array memcpy(bytes_array,u.temp_array,4); }
float float_example = 1.11; byte bytes[4]; float2Bytes(float_example,&bytes[0]);
感谢大家的帮助,我已经学到了很多关于指针和引用在过去20分钟,干杯堆溢出!
解决方法
最简单的是做一个联盟:
#include <stdio.h> int main(void) { int ii; union { float a; unsigned char bytes[4]; } thing; thing.a = 1.234; for (ii=0; ii<4; ii++) printf ("byte %d is %02x\n",ii,thing.bytes[ii]); return 0; }
输出:
byte 0 is b6 byte 1 is f3 byte 2 is 9d byte 3 is 3f
注意 – 无法保证字节顺序…这取决于您的机器架构.
要使您的功能正常工作,请执行以下操作:
void float2Bytes(byte* bytes_temp[4],float float_variable){ union { float a; unsigned char bytes[4]; } thing; thing.a = float_variable; memcpy(bytes_temp,thing.bytes,4); }
还是要真的搞砸了
void float2Bytes(byte* bytes_temp[4],float float_variable){ memcpy(bytes_temp,(unsigned char*) (&float_variable),4); }
注意 – 在任一种情况下,我确保将数据复制到作为输入参数给出的位置.这是至关重要的,因为局部变量在你返回后不会存在(虽然你可以声明它们是静态的,但是我们不会教你不好的习惯,如果函数再次被调用)