Depois de muito tempo sem postar nada, hoje vou compartilhar uma classe C# que converte float IEEE para float Microchip e vice-versa.

Esse código foi reformulado e retestado.

[sections] [section title=”Classe C# que converte float IEEE para float Microchip e vice-versa”]

public static class CsConvertions
{
public static float ConvertMicrochipFloatToIeeeByteArray(byte[] bytes)
{
if (bytes.Length != 4)
{
throw new Exception("Error qtd bytes");
}
bool sign = ((bytes[2] & 0x80) == 0x80);
bytes[2] = (byte) (bytes[2] & 0x7f);
int vConvertido = (ushort) (bytes[3] << 7) | bytes[2];
vConvertido |= (UInt16) (sign ? 0x8000 : 0);
byte[] bytesvConvertidoParcial = BitConverter.GetBytes(vConvertido);
var bytesvConvertido = new[] { bytesvConvertidoParcial[1], bytesvConvertidoParcial[0], bytes[1], bytes[0] };
return BitConverter.ToSingle(bytesvConvertido, 0);
}

public static byte[] ConvertIeeeFloatToMicrochipByteArray(float value)
{
byte[] b = BitConverter.GetBytes(value);
var c = (ushort) (b[3] << 8 | b[2]);
c <<= 1;
c &= 0xff00;
c |= (ushort) (b[2] & 0x7F);
byte[] d = BitConverter.GetBytes(c);
return (new[] { b[0], b[1], d[0], d[1] });
}

public static float ConvertMicrochipFloatToIeeefloat(float value)
{
byte[] bytes = (byte[]) BitConverter.GetBytes(value).Reverse().ToArray();
bool sign = ((bytes[2] & 0x80) == 0x80);
bytes[2] = (byte) (bytes[2] & 0x7f);
int vConvertido = (ushort) (bytes[3] << 7) | bytes[2];
vConvertido |= (UInt16) (sign ? 0x8000 : 0);
byte[] bytesvConvertidoParcial = BitConverter.GetBytes(vConvertido);
var bytesvConvertido = new[] { bytes[0],bytes[1], bytesvConvertidoParcial[0],bytesvConvertidoParcial[1] };
return BitConverter.ToSingle(bytesvConvertido, 0);
}

public static float ConvertIeeeFloatToMicrochipfloat(float value)
{
byte[] b = BitConverter.GetBytes(value);
var c = (ushort) (b[3] << 8 | b[2]);
c <<= 1;
c &= 0xff00;
c |= (ushort) (b[2] & 0x7F);
byte[] d = BitConverter.GetBytes(c);
return (BitConverter.ToSingle(new[] {b[0],b[1],d[0], d[1] },0));
}

}

[/section] [/sections]
Obrigado e até o próximo post.

DATEK Tecnologia Eletrônica
[C#] Classe C# que converte float IEEE para float Microchip e vice-versa

Deixe uma resposta

%d blogueiros gostam disto: