我有一个 C# NETMF项目,我需要将 a 转换float
为 a byte[]
,反之亦然。问题是,NETMF 没有System.BitConverter
.NET 之类的东西,所以我真的找不到任何方法来做到这一点,除非我自己去做。
我一直在编写高级(Java、Python、C#等)并且只涉足 C++,所以我真的不知道如何将浮点数转换为字节数组。
执行此操作的样板函数的一些示例代码是什么样的?
.NET Micro Framework支持,因此您StructLayoutAttribute
可以使用 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;
}
}
与整数(Int32、Byte、UInt64 等)不同,其中每个值都可以从整数字节中每个位的状态轻松确定,二进制浮点数没有直观的表示,因此 IEEE 定义了一个规范浮点数:IEEE-754。可以说,这并不简单,但遵循规范中的规则将允许您将 .NET System.Single 和 System.Double 实例序列化为一系列字节。
桌面 .NET Framework 实际上在这里作弊。GetBytes(Single) 函数实际上只是将 Single 实例转换为 Int32,然后使用原始指针将原始字节复制到 4 字节数组中。但是你不能使用这个有用的快捷方式,因为微框架不支持指针——更糟糕的是:MF 也不包含 BinaryWriter。恐怕你必须推出自己的 IEEE-754 串行器。
BinaryWriter
在 a上使用a MemoryStream
。