在C#NETMF中将float转换为字节数组(NETMF没有BitConverter)

时间:2012-06-18 17:24:53

标签: c# .net .net-micro-framework

我有一个C#NETMF项目,我需要将float转换为byte[],反之亦然。问题是,NETMF没有像.NET这样的System.BitConverter,所以我不能真正找到任何方法来做到这一点而不用低级别并自己做。

我总是编写高级(JavaPythonC#等等,而且只涉及C ++,所以我真的不知道怎么转浮入一个字节数组。

执行此操作的样板代码的示例代码会是什么样的?

3 个答案:

答案 0 :(得分:4)

.NET Micro Framework的StructLayoutAttributesupported,因此您可以使用C ++样式联合来获取浮点数的字节(反之亦然):

[StructLayout(LayoutKind.Explicit)]  
public struct FloatUnion
{ 
    [FieldOffset(0)] public float Value;
    [FieldOffset(0)] public byte Byte0;
    [FieldOffset(1)] public byte Byte1;
    [FieldOffset(2)] public byte Byte2;
    [FieldOffset(3)] public byte Byte3;

    public byte[] ToByteArray()
    {
        return new[] { Byte0, Byte1, Byte2, Byte3 };
    }

    public static byte[] FloatToBytes(float value)
    {
        return new FloatUnion { Value = value }.ToByteArray();
    }

    public static float BytesToFloat(byte[] bytes)
    {
        if (bytes.Length != 4) throw new ArgumentException("You must provide four bytes.");
        return new FloatUnion { Byte0 = bytes[0], Byte1 = bytes[1], Byte2 = bytes[2], Byte3 = bytes[3] }.Value;
    }
}

答案 1 :(得分:1)

不同于整数(Int32,Byte,UInt64等),其中每个值很容易根据整数字节中每个位的状态确定,因此没有直观的二进制浮点数表示,因此IEEE定义浮点数的规范:IEEE-754。可以说,这并不简单,但遵循规范中的规则将允许您将.NET System.Single和System.Double实例序列化为一系列字节。

桌面.NET Framework实际上在这里作弊。 GetBytes(Single)函数实际上只是将Single实例转换为Int32,然后使用原始指针将原始字节复制到4字节数组中。但是你不能采用这个有用的快捷方式,因为微框架不支持指针 - 更糟糕的是:MF也不包括BinaryWriter。你不得不推出自己的IEEE-754串行器。

答案 2 :(得分:0)

BinaryWriter

之上使用MemoryStream