【发布时间】: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.003879905 和 0x00D8 给出了值接近 -1.003879905 但不精确。可能是因为在 0x0080 之后观察到的轻微偏移,当可见的下降从 0x00B0 开始时,但如果整个范围相等,则应该在 0x0094 左右对称。但也可能存在轻微的测量误差。
那么,如何在 C# 中获取一个函数,将源数据转换为 4 字节浮点数?
【问题讨论】:
-
你从哪里得到 “2 byte”(16 位)?
uint是 32 bit。float/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