【问题标题】:Convert float to byte array in C# NETMF (NETMF doesn't have BitConverter)在 C# NETMF 中将浮点数转换为字节数组(NETMF 没有 BitConverter)
【发布时间】:2012-06-18 17:24:52
【问题描述】:

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

我一直编写高级(JavaPythonC# 等)并且只涉足 C++,所以我真的不知道如何将浮点数转换为字节数组。

执行此操作的样板函数的一些示例代码是什么样的?

【问题讨论】:

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


【解决方案1】:

StructLayoutAttribute 是 .NET Micro Framework 的 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;
    }
}

【讨论】:

  • 请注意,这可能需要修改以考虑字节序。
  • @NPSF3000:确实。幸运的是,这很容易调整。
  • @AllonGuralnek FieldOffset 在 .NETMF (System.Runtime.InteropServices) 中不存在
  • @LordofScripts:是的,看起来是这样。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    MemoryStream 上使用BinaryWriter

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 2014-02-22
    • 1970-01-01
    • 2020-07-29
    相关资源
    最近更新 更多