将byte []转换为数组问题

时间:2013-11-28 08:20:37

标签: c# floating-point marshalling bitconverter

请检查此代码

float f = BitConverter.ToSingle(new byte[] { 0xBF, 0x04, 0x8E, 0xFF }, 0);
byte[] b = BitConverter.GetBytes(f);
这是一个奇怪的结果。 b将是{0xBF,0x04,0xCE,0xFF}

我猜是因为f的值是NaN。 我之所以提出这个问题,是因为我使用Marsal将字节流转换为包含float的结构,I swap endianity

当我到达场地的时候已经搞砸了(就像上面的例子一样)

任何想法?

谢谢!

2 个答案:

答案 0 :(得分:2)

由于您的问题出现在endian中,我想知道是否检查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();

答案 1 :(得分:0)

这有效:

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

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