将浮点数转换为字节数组的 C 函数

2024-04-06

我正在尝试创建一个函数来接受浮点变量并将其转换为字节数组。我找到了一段有效的代码片段,但如果可能的话,希望在函数中重用它。

我也在使用 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)正在使用铸造什么的?

任何帮助将不胜感激!

Cheers

*编辑:已解决

这是我在 Arduino 中运行的最终函数,供任何发现它的人使用。下面的答案中有更有效的解决方案,但是我认为这是可以理解的。

功能:将输入浮点变量转换为字节数组

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 分钟里我学到了很多关于指针和引用的知识,干杯 Stack Overflow!


最简单的方法是建立一个联盟:

#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;
}

Output:

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);
}

注意 - 在任何一种情况下,我都会确保将数据复制到作为输入参数给出的位置。这一点至关重要,因为局部变量在你返回后将不存在(尽管你可以声明它们static,但我们不会教你坏习惯。如果该函数再次被调用怎么办……)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将浮点数转换为字节数组的 C 函数 的相关文章

随机推荐