将4个字节复制到float时缓冲区溢出

时间:2014-01-29 18:55:04

标签: c memcpy buffer-overflow

我使用0x40, 0x7E, 0xA7, 0xF2将以下4个字节float复制到memcpy变量。现在我的c编译器为float保留了4个字节,因此我复制到它的4个字节不应该导致溢出。

我的“当前”输出是 -2147483648-2147483648.-2147483648 mA

-2147483648 似乎表明缓冲区溢出。我不确定为什么它给了我这个价值。这是一个编译的例子:

 #include <stdio.h>
#include <string.h>

typedef struct {
  float     current;
} hart_value_t;
hart_value_t  hart_values;

unsigned char buf[4] = { 0x40, 0x7E, 0xA7, 0xF2 };

void spltfp(double value, int * intpart, int * decpart)
{
  int i;
  double dec;

  i = (int)value;
  printf("What value do I get here: %d", i);
  dec = value - i;

  if (dec < 0) {
    dec = -dec;
  }

  *intpart = i;
  *decpart = (int)(dec * 100);
}

void hartBufferReadFloat(unsigned char * buf, float * data)
{
  printf("What is the size of float: %lu", sizeof(float)); // returns 4
  memcpy(data, buf, 4); /* 0x40, 0x7E, 0xA7, 0xF2 */
}

void hartPrintFloat(float val)
{
  int intpart, decpart;

  spltfp(val, &intpart, &decpart);
  printf("%d.%02d", intpart, decpart);
}

int main(void)
{
    hartBufferReadFloat(buf, &hart_values.current);
    printf("Current: "); hartPrintFloat(hart_values.current); printf(" mA\n");
    return 0;
}

2 个答案:

答案 0 :(得分:4)

对于big-endian系统,你有值0x40,0x7e,0xa7,0xf2,但你的系统是little-endian。他们需要逆转。

直接访问表示对象的字节通常不能在不同系统之间移植。字节在表示中出现的顺序只是可能出现的差异之一。

答案 1 :(得分:-1)

float有自己的格式,其中并非所有类似int的32位值都有效。查看IEEE 754