【问题标题】:Decompression of 2 byte to 4 byte float2字节解压到4字节浮点数
【发布时间】:2019-08-17 10:30:27
【问题描述】:

我有一些动画数据 (x,y,z),它表示为 2 字节结构并用 Little Endian 编写。我知道它们应该是一个 4 字节的浮点数,所以我必须解压缩它们。我收集了一些尽可能精确的样本值(它们并不代表完全压缩的值,但非常接近它们)并在几个范围内粗略地划分了压缩值。

样本值(小端序):

  • 0.048879981 - 0x0046
  • 0.056879997 - 0x0047
  • 0.253880024 - 0x0050
  • 0.313879967 - 0x0051
  • 0.623880029 - 0x0055
  • 1.003879905 - 0x0058
  • -0.066120029 - 0x00С8
  • -0.1561199428 - 0x00СD
  • -0.8691199871 - 0x00D7

范围:

  • 0x0000 :
  • [0x0000,0x0014] : 不可见的变化(可能会增加)
  • [0x0014, ....]:增加(可见)
  • 0x0080 : ,可能是符号变化的点
  • [0x0080,0x00B0] : 不可见的变化(可能会减少)
  • [0x00B0, ....]:减少(可见)

在范围的末端有间隙 (....),因为很难正确检查它们,但我假设在实践中不会使用靠近这些末端的如此大的值。

此外,它看起来像是正负范围之间的对称,例如我测试了 0x0058 给出了 1.0038799050x00D8 给出了值接近 -1.003879905 但不精确。可能是因为在 0x0080 之后观察到的轻微偏移,当可见的下降从 0x00B0 开始时,但如果整个范围相等,则应该在 0x0094 左右对称。但也可能存在轻微的测量误差。

那么,如何在 C# 中获取一个函数,将源数据转换为 4 字节浮点数?

【问题讨论】:

  • 你从哪里得到 “2 byte”(16 位)? uint32 bitfloat/Single 也是 32 位的,所以不知道你为什么要打包
  • ...您的问题听起来也像是在寻求代码审查,因为没有实际问题需要解决How to Ask。祝你好运
  • 我使用 ReadUInt16() 从文件中读取 Uint16,并且我坚信,存储的值在提取时应该是 4 字节浮点数。实际的问题是如何将这些 Uint16(或 Int16)正确地转换为单精度浮点值。也许我的代码是错误的,有人可以提供任何其他解决方案。
  • (a) 关于正在使用的 16 位浮点格式,您有哪些信息? (b) 你有哪些样本值,显示了一些 16 位浮点值和它们代表的数字? (c) 你是如何“用 C# 编写一段代码”的?如果没有比您提供给我们的更多信息,就不可能编写您显示的代码。该代码显然是尝试将 IEEE-754 binary16 或类似的东西转换为 IEEE-754 binary32。这不是凭空出现的代码。你从哪里得到它或编写它的信息?
  • 使用强制转换而不是压缩。浮点数包含指数,而您的算法未使用 math.power 方法。

标签: c# floating-point compression


【解决方案1】:

目前基于问题中的信息的一些初始 cmet:

  • byte[] buffer = new byte[4]; 是一种不好的方法,因为它单独寻址字节,而其他代码使用字内的移位来操作位,而 C# 没有定义字节顺序。只需对所有工作使用无符号 32 位整数。代码实际上会更简单。
  • 代码无法正确处理次正常值。如果num2 为零且num3 不为零,则必须移动有效位 (num3) 并调整指数 (num2)。

【讨论】:

    猜你喜欢
    • 2012-12-01
    • 2011-05-29
    • 2017-03-25
    • 1970-01-01
    • 2011-02-26
    • 2011-10-29
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多