我有一个C#NETMF项目,我需要将float
转换为byte[]
,反之亦然。问题是,NETMF没有像.NET这样的System.BitConverter
,所以我不能真正找到任何方法来做到这一点而不用低级别并自己做。
我总是编写高级(Java,Python,C#等等,而且只涉及C ++,所以我真的不知道怎么转浮入一个字节数组。
执行此操作的样板代码的示例代码会是什么样的?
答案 0 :(得分:4)
.NET Micro Framework的StructLayoutAttribute
为supported,因此您可以使用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