Конвертировать 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.