【问题标题】:Divide a float into single bytes将浮点数划分为单个字节
【发布时间】:2013-12-24 17:18:18
【问题描述】:

我正在使用 RakNet 进行联网,我需要传输浮点值。问题是,我只能发送单个字节。 由于浮点数由 4 个字节组成,我认为必须有可能将浮点数分解为这四个字节并发送它们。在那之后,我想再次将它们组合成一个浮动。

我该怎么做?

【问题讨论】:

标签: c++ networking


【解决方案1】:
  1. memcpy 将原始 float 值转换为适当大小的 unsigned chars 数组

    float f = ...;
    
    unsigned char c[sizeof f];
    memcpy(c, &f, sizeof f);
    // use `c[i]` to access the bytes
    
  2. 使用reinterpret_cast将原始指针重新解释为unsigned chars的数组

    float f = ...;
    
    unsigned char *c = reinterpret_cast<unsigned char *>(&f);
    // use `c[i]` to access the bytes
    
  3. 使用联合执行相同的重新解释

    union FC {
      float f;
      unsigned char c[sizeof FC::f];
    };
    
    float f = ...;
    
    FC u = { f };
    // use `u.c[i]` to access the bytes
    

请记住一些额外的细节:最后一种方法(union)现在在 C 中是合法的,但在 C++ 中仍然是正式的非法 - 您不能在 C++ 中读取“非活动”联合成员。观察小端与大端平台上的字节顺序。如果您使用第二种方法,还要将收件人 float 重新解释为 unsigned chars 的数组,而不是相反以避免对齐问题。

【讨论】:

  • 我不会使用 memcpy 函数,因为从安全的角度来看,它是一个非常危险的函数。 ;)
  • @NKN:如果你知道自己在做什么,那就没什么风险了。 “风险”功能是指无法为您提供任何预防问题机会的功能(例如getsatoi)。 memcpy 不属于该类别。
  • 感谢您的回答。第一种方法听起来最简单。但是如何从这些字节中再次制作浮点数?
  • @Less Jemai:在第一种方法中,您只需将 memcpy 它从 char 数组返回到 float 对象。在第二种方法中......好吧,你必须小心:将目标float对象重新解释为char数组并在那里写入数据。在第三种方法中,您只需向后执行:将字节存储到u.c,然后读取u.f
  • @zhiayang:将 char 数组重新解释为浮点数不是一个好主意:它不能保证满足对齐要求,通常是非法的。
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-31
相关资源
最近更新 更多