【问题标题】:Converting byte[] to array issue将 byte[] 转换为数组问题
【发布时间】:2013-11-28 08:20:37
【问题描述】:

请检查此代码

float f = BitConverter.ToSingle(new byte[] { 0xBF, 0x04, 0x8E, 0xFF }, 0);
byte[] b = BitConverter.GetBytes(f);

这会产生一个奇怪的结果。 b 将是 { 0xBF, 0x04, 0xCE, 0xFF }

我猜是因为 f 的值是 NaN。 我问这个问题的原因是因为我使用 Marsal 将字节流转换为包含浮点数的结构,我交换字节序

问题是当我到达现场时已经搞砸了(就像上面的例子)

有什么想法吗?

谢谢!

【问题讨论】:

  • 在转换为浮点数之前更改字节序
  • 我不能。我正在将 byte[] 转换为 struct,在那个阶段我不知道它的内部结构。
  • @harold 如果您在两个方向上都使用BitConverter,则不必担心字节顺序 - 实际上,如果字节被反转,那将是问题,而不是如果它们只是变异了
  • @MarcGravell 这次是个问题,因为原始输入(即{ 0xBF, 0x04, 0x8E, 0xFF })是错误的。这产生了一个 NaN,然后​​事情开始向南发展。
  • @TheDude 请澄清一下,这个值 supposed 是 NaN 吗?或类似 -0.51780695

标签: c# floating-point marshalling bitconverter


【解决方案1】:

由于您的问题出现在字节序上,我想知道是否检查 NaN 并反转顺序并在必要时设置一个布尔值以将其反转回来,这会有所帮助:

byte[] input = { 0xBF, 0x04, 0x8E, 0xFF };
bool reversed = false;
float f = BitConverter.ToSingle(input, 0);

if (float.IsNaN(f))
{
    reversed = true;
    f = BitConverter.ToSingle(input.Reverse().ToArray(), 0);
}

byte[] b = BitConverter.GetBytes(f);

if (reversed)
    b = b.Reverse().ToArray();

【讨论】:

  • f == float.NaN 将永远是 false。将其更改为float.IsNaN(f)
  • @AgentFire viva le Resharper
  • @RoyiNamir 嗯不,没有任何工具,我只是检查了代码。
  • @AgentFire,好吧,我的 reshaper 警告过我。
  • @AgentFire 最好的。(IMO)。
【解决方案2】:

这行得通:

double f = BitConverter.ToDouble(new byte[] { 0, 0, 0, 0, 0xBF, 0x04, 0x8E, 0xFF }, 0);
byte[] b = BitConverter.GetBytes(f);

这个也可以:

int f = BitConverter.ToInt32(new byte[] { 0xBF, 0x04, 0x8E, 0xFF }, 0);
byte[] b = BitConverter.GetBytes(f);

我相信原因在于单浮点存储。第三个字节({ 0xBF, 0x04, [0x8E to 0xBE] , 0xFF } 在转换时由于某种原因被+4'd。

4字节的好容器是Int32,我建议你使用它。

【讨论】:

  • 那个 double 代表一个完全不同的数字,是无关紧要的。这不是十进制精度问题,因为数字已经是二进制格式。这里的问题是字节导致 NaN。如果 OP 只是想要一个 4 字节的容器,为什么不直接使用 byte[]?
  • @Rik 至少因为byte[] 以及任何其他数组都是引用类型的对象。 double 仍然是一个容器。
  • 这应该是选择的答案,因为它不仅清楚地解释了导致问题字节被更改的原因,而且当4字节数据块必须通过BitConverter两次时,它也显示了两个很好的解决方案在相反的方向,但不能保证它们是有效的单浮点数。有多种情况会出现这种情况。这对我很有帮助。
猜你喜欢
  • 1970-01-01
  • 2012-05-18
  • 2020-05-17
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
相关资源
最近更新 更多