using System;
using System.Collections.Generic;
using System.Text;
namespace ZWaveApi.Net.Utilities
{
static class ByteFunctions
{
private const byte _sizeMask = 0x07;
private const byte _scaleMask = 0x18;
private const byte _scaleShift = 0x03;
private const byte _precisionMask = 0xe0;
private const byte _precisionShift = 0x05;
static public int ExtractValue(byte[] _data, ref byte _scale)
{
byte size = (byte)(_data[0] & _sizeMask);
byte precision = (byte)((_data[0] & _precisionMask) >> _precisionShift);
if (_scale != null)
{
_scale = (byte)((_data[0] & _scaleMask) >> _scaleShift);
}
UInt32 value = 0;
int result = 0;
byte i;
for (i = 0; i < size; ++i)
{
value <<= 8;
value |= (UInt32)_data[i + 1];
}
// Deal with sign extension. All values are signed
if ((_data[1] & 0x80) == 0x80)
{
// MSB is signed
if (size == 1)
{
value |= 0xffffff00;
}
else if (size == 2)
{
value |= 0xffff0000;
}
result = (int)(-1 * value);
}
else
{
result = (int)(value);
}
if (precision == 0)
{
return result;
}
else
{
return result / (int)Math.Pow(10, precision);
}
}
static public int ByteToInt(byte[] _value)
{
if (BitConverter.IsLittleEndian)
{
Array.Reverse(_value);
}
if (_value.Length == 1)
{
return (Byte)(_value[0]);
}
else if (_value.Length == 2)
{
return BitConverter.ToInt16(_value, 0);
}
else
{
return BitConverter.ToInt32(_value, 0);
}
}
static public byte[] IntToBytes(int _value)
{
byte[] result;
int size = 4;
if (_value < 0)
{
if ((_value & 0xffffff80) == 0xffffff80)
{
size = 1;
}
else if ((_value & 0xffff8000) == 0xffff8000)
{
size = 2;
}
}
else
{
if ((_value & 0xffffff00) == 0)
{
size = 1;
}
else if ((_value & 0xffff0000) == 0)
{
size = 2;
}
}
result = new byte[size];
if (size > 2)
{
result[size - 4] = (byte)(_value >> 24);
result[size - 3] = (byte)(_value >> 16);
}
if (size > 1)
{
result[size - 2] = (byte)(_value >> 8);
}
result[size - 1] = (byte)(_value);
return result;
}
}
}