mirror of
https://github.com/S7NetPlus/s7netplus.git
synced 2026-02-17 22:38:27 +08:00
167 lines
5.0 KiB
C#
167 lines
5.0 KiB
C#
using System;
|
|
|
|
namespace S7.Net.Types
|
|
{
|
|
public static class Double
|
|
{
|
|
// publics
|
|
#region FromByteArray
|
|
public static double FromByteArray(byte[] bytes)
|
|
{
|
|
byte v1 = bytes[0];
|
|
byte v2 = bytes[1];
|
|
byte v3 = bytes[2];
|
|
byte v4 = bytes[3];
|
|
|
|
if ((int)v1 + v2 + v3 + v4 == 0)
|
|
{
|
|
return 0.0;
|
|
}
|
|
else
|
|
{
|
|
// nun String bilden
|
|
string txt = ValToBinString(v1) + ValToBinString(v2) + ValToBinString(v3) + ValToBinString(v4);
|
|
// erstmal das Vorzeichen
|
|
int vz = int.Parse(txt.Substring(0, 1));
|
|
int exd = Conversion.BinStringToInt32(txt.Substring(1, 8));
|
|
string ma = txt.Substring(9, 23);
|
|
double mantisse = 1;
|
|
double faktor = 1.0;
|
|
|
|
//das ist die Anzahl der restlichen bit's
|
|
for (int cnt = 0; cnt <= 22; cnt++)
|
|
{
|
|
faktor = faktor / 2.0;
|
|
//entspricht 2^-y
|
|
if (ma.Substring(cnt, 1) == "1")
|
|
{
|
|
mantisse = mantisse + faktor;
|
|
}
|
|
}
|
|
return Math.Pow((-1), vz) * Math.Pow(2, (exd - 127)) * mantisse;
|
|
}
|
|
}
|
|
#endregion
|
|
#region FromDWord
|
|
public static double FromDWord(Int32 value)
|
|
{
|
|
byte[] b = DInt.ToByteArray(value);
|
|
double d = FromByteArray(b);
|
|
return d;
|
|
}
|
|
|
|
public static double FromDWord(UInt32 value)
|
|
{
|
|
byte[] b = DWord.ToByteArray(value);
|
|
double d = FromByteArray(b);
|
|
return d;
|
|
}
|
|
#endregion
|
|
|
|
#region ToByteArray
|
|
public static byte[] ToByteArray(double value)
|
|
{
|
|
double wert = (double)value;
|
|
string binString = "";
|
|
byte[] bytes = new byte[4];
|
|
if (wert != 0f)
|
|
{
|
|
if (wert < 0)
|
|
{
|
|
wert *= -1;
|
|
binString = "1";
|
|
}
|
|
else
|
|
{
|
|
binString = "0";
|
|
}
|
|
int exponent = (int)Math.Floor((double)Math.Log(wert) / Math.Log(2.0));
|
|
wert = wert / (Math.Pow(2, exponent)) - 1;
|
|
|
|
binString += ValToBinString((byte)(exponent + 127));
|
|
for (int cnt = 1; cnt <= 23; cnt++)
|
|
{
|
|
if (!(wert - System.Math.Pow(2, -cnt) < 0))
|
|
{
|
|
wert = wert - System.Math.Pow(2, -cnt);
|
|
binString += "1";
|
|
}
|
|
else
|
|
binString += "0";
|
|
}
|
|
bytes[0] = (byte)BinStringToByte(binString.Substring(0, 8));
|
|
bytes[1] = (byte)BinStringToByte(binString.Substring(8, 8));
|
|
bytes[2] = (byte)BinStringToByte(binString.Substring(16, 8));
|
|
bytes[3] = (byte)BinStringToByte(binString.Substring(24, 8));
|
|
|
|
}
|
|
else
|
|
{
|
|
bytes[0] = 0;
|
|
bytes[1] = 0;
|
|
bytes[2] = 0;
|
|
bytes[3] = 0;
|
|
}
|
|
return bytes;
|
|
}
|
|
|
|
public static byte[] ToByteArray(double[] value)
|
|
{
|
|
ByteArray arr = new ByteArray();
|
|
foreach (double val in value)
|
|
arr.Add(ToByteArray(val));
|
|
return arr.array;
|
|
}
|
|
#endregion
|
|
#region ToArray
|
|
public static double[] ToArray(byte[] bytes)
|
|
{
|
|
double[] values = new double[bytes.Length / 4];
|
|
|
|
int counter = 0;
|
|
for (int cnt = 0; cnt < bytes.Length / 4; cnt++)
|
|
values[cnt] = FromByteArray(new byte[] { bytes[counter++], bytes[counter++], bytes[counter++], bytes[counter++] });
|
|
|
|
return values;
|
|
}
|
|
#endregion
|
|
|
|
// privates
|
|
#region ValToBinString
|
|
private static string ValToBinString(byte value)
|
|
{
|
|
string txt = "";
|
|
|
|
for (int cnt = 7; cnt >= 0; cnt += -1)
|
|
{
|
|
if ((value & (byte)Math.Pow(2, cnt)) > 0)
|
|
txt += "1";
|
|
else
|
|
txt += "0";
|
|
}
|
|
return txt;
|
|
}
|
|
#endregion
|
|
#region BinStringToByte
|
|
private static byte? BinStringToByte(string txt)
|
|
{
|
|
int cnt = 0;
|
|
int ret = 0;
|
|
|
|
if (txt.Length == 8)
|
|
{
|
|
for (cnt = 7; cnt >= 0; cnt += -1)
|
|
{
|
|
if (int.Parse(txt.Substring(cnt, 1)) == 1)
|
|
{
|
|
ret += (int)(Math.Pow(2, (txt.Length - 1 - cnt)));
|
|
}
|
|
}
|
|
return (byte)ret;
|
|
}
|
|
return null;
|
|
}
|
|
#endregion
|
|
}
|
|
}
|