Convert 'float' to 'byte [4]' and vice versa to 'float' in the .NET Micro Framework

What is the best way to convert float to byte[4] and then back to 'float'?

I do this in C # .NET Micro Framework , so there is no BitConverter for my use.

+6
c # embedded .net-micro-framework
Jan 20 '11 at 2:25
source share
3 answers

I changed the BitConverter class BitConverter implement the Netduino to allow the specification (not the best option), but it works). If an array of bytes was sent over the network, I would use BigEndian . We remind you that unsafe is not officially supported in NETMF.

 using System; using System.Diagnostics; namespace netduino { public static class BitConverter { public static byte[] GetBytes(uint value) { return new byte[4] { (byte)(value & 0xFF), (byte)((value >> 8) & 0xFF), (byte)((value >> 16) & 0xFF), (byte)((value >> 24) & 0xFF) }; } public static unsafe byte[] GetBytes(float value) { uint val = *((uint*)&value); return GetBytes(val); } public static unsafe byte[] GetBytes(float value, ByteOrder order) { byte[] bytes = GetBytes(value); if (order != ByteOrder.LittleEndian) { System.Array.Reverse(bytes); } return bytes; } public static uint ToUInt32(byte[] value, int index) { return (uint)( value[0 + index] << 0 | value[1 + index] << 8 | value[2 + index] << 16 | value[3 + index] << 24); } public static unsafe float ToSingle(byte[] value, int index) { uint i = ToUInt32(value, index); return *(((float*)&i)); } public static unsafe float ToSingle(byte[] value, int index, ByteOrder order) { if (order != ByteOrder.LittleEndian) { System.Array.Reverse(value, index, value.Length); } return ToSingle(value, index); } public enum ByteOrder { LittleEndian, BigEndian } static public bool IsLittleEndian { get { unsafe { int i = 1; char* p = (char*)&i; return (p[0] == 1); } } } } } namespace BitConverterTest { class Program { static void Main(string[] args) { byte[] msbFirst = new byte[] { 0x42, 0xF6, 0xE9, 0xE0 }; byte[] lsbFirst = new byte[] { 0xE0, 0xE9, 0xF6, 0x42 }; const float f = 123.456789F; byte[] b = netduino.BitConverter.GetBytes(f, netduino.BitConverter.ByteOrder.BigEndian); for (int i = 0; i < b.Length; i++) { Debug.Assert(msbFirst[i] == b[i], "BitConverter.GetBytes(float, BigEndian) i=" + i); } Debug.Assert(f == netduino.BitConverter.ToSingle(msbFirst, 0, netduino.BitConverter.ByteOrder.BigEndian)); Console.WriteLine("All tests passed"); Console.ReadKey(); } } } 
+2
Jan 20 '11 at 18:59
source share

Converting from uint to float (and vice versa) can be done using "safe" code (although I don't know if this is possible in NETMF or not).

 [StructLayout(LayoutKind.Explicit)] struct UIntFloat { [FieldOffset(0)] public float FloatValue; [FieldOffset(0)] public uint IntValue; } public static float ToSingle(byte[] value, int index) { uint i = ToUInt32(value, index); return ToSingle(i); } public static float ToSingle(uint value) { UIntFloat uf = new UIntFloat(); uf.IntValue = value; return uf.FloatValue; } 
+9
May 12 '11 at 16:36
source share

It worked for me, maybe not the most complete answer, but simple

 void floatToByte(GLubyte b[], float n) { unsigned int val = *((unsigned int*)&n); b[0] = (GLubyte)(val & 0xFF); b[1] = (GLubyte)((val >> 8) & 0xFF); b[2] = (GLubyte)((val >> 16) & 0xFF); b[3] = (GLubyte)((val >> 24) & 0xFF); } float byteToFloat(GLubyte b[]) { unsigned int ret = (unsigned int)(b[0] << 0 | b[1] << 8 | b[2] << 16 | b[3] << 24); float r = *(((float*)&ret)); return r; } 
+1
Dec 14 '12 at 20:18
source share



All Articles