Конвертировать float в байтовый массив в C# NETMF (NETMF не имеет BitConverter)

У меня есть проект C# NETMF, и мне нужно преобразовать float к byte[] и наоборот. Проблема в том, что NETMF не имеет System.BitConverter как.NET, поэтому я не могу найти какой-либо способ сделать это, не переходя на низкий уровень и делая это сам.

Я всегда программировал на высоком уровне ( Java, Python, C# и т. Д.) И только баловался на C++, поэтому я не знаю, как превратить float в байтовый массив.

Как будет выглядеть пример кода стандартной функции для этого?

3 ответа

StructLayoutAttribute поддерживается.NET Micro Framework, так что вы можете использовать объединение стилей 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 на вершине MemoryStream,

Другие вопросы по тегам