/// <summary>
/// A Little Endian bit converter.
/// </summary>

namespace PowerUI{
	
	public static class LittleConverter
	{
		
		public static ulong ToUInt64(byte[] data,int offset)
		{
			return    ( (ulong) data[offset] ) | 
					( ( (ulong) data[offset+1] ) << 8 ) | 
					( ( (ulong) data[offset+2] ) << 16 ) | 
					( ( (ulong) data[offset+3] ) << 24 ) | 
					( ( (ulong) data[offset+4] ) << 32 ) | 
					( ( (ulong) data[offset+5] ) << 40 ) | 
					( ( (ulong) data[offset+6] ) << 48 ) | 
					( ( (ulong) data[offset+7] ) << 56 );
		}
		
		public static long ToInt64(byte[] data,int offset)
		{
			return    ( (long) data[offset] ) | 
					( ( (long) data[offset+1] ) << 8 ) | 
					( ( (long) data[offset+2] ) << 16 ) | 
					( ( (long) data[offset+3] ) << 24 ) | 
					( ( (long) data[offset+4] ) << 32 ) | 
					( ( (long) data[offset+5] ) << 40 ) | 
					( ( (long) data[offset+6] ) << 48 ) | 
					( ( (long) data[offset+7] ) << 56 );
		}
		
		public static ulong ToUInt56(byte[] data,int offset)
		{
			return    ( (ulong) data[offset] ) | 
					( ( (ulong) data[offset+1] ) << 8 ) | 
					( ( (ulong) data[offset+2] ) << 16 ) | 
					( ( (ulong) data[offset+3] ) << 24 ) | 
					( ( (ulong) data[offset+4] ) << 32 ) | 
					( ( (ulong) data[offset+5] ) << 40 ) | 
					( ( (ulong) data[offset+6] ) << 48 );
		}
		
		public static long ToInt56(byte[] data,int offset)
		{
			return  (long) ( ( ( (ulong) data[offset] ) | 
					( ( (ulong) data[offset+1] ) << 8 ) | 
					( ( (ulong) data[offset+2] ) << 16 ) | 
					( ( (ulong) data[offset+3] ) << 24 ) | 
					( ( (ulong) data[offset+4] ) << 32 ) | 
					( ( (ulong) data[offset+5] ) << 40 ) | 
					( ( (ulong) data[offset+6] ) << 48 )
					) - (long.MaxValue >> 8) );
		}
		
		public static ulong ToUInt48(byte[] data,int offset)
		{
			return    ( (ulong) data[offset] ) | 
					( ( (ulong) data[offset+1] ) << 8 ) | 
					( ( (ulong) data[offset+2] ) << 16 ) | 
					( ( (ulong) data[offset+3] ) << 24 ) | 
					( ( (ulong) data[offset+4] ) << 32 ) | 
					( ( (ulong) data[offset+5] ) << 40 );
		}
		
		public static long ToInt48(byte[] data,int offset)
		{
			return  (long) ( ( ( (ulong) data[offset] ) | 
					( ( (ulong) data[offset+1] ) << 8 ) | 
					( ( (ulong) data[offset+2] ) << 16 ) | 
					( ( (ulong) data[offset+3] ) << 24 ) | 
					( ( (ulong) data[offset+4] ) << 32 ) | 
					( ( (ulong) data[offset+5] ) << 40 )
					) - (long.MaxValue >> 16) );
		}
		
		public static ulong ToUInt40(byte[] data,int offset)
		{
			return    ( (ulong) data[offset] ) | 
					( ( (ulong) data[offset+1] ) << 8 ) | 
					( ( (ulong) data[offset+2] ) << 16 ) | 
					( ( (ulong) data[offset+3] ) << 24 ) | 
					( ( (ulong) data[offset+4] ) << 32 );
		}
		
		public static long ToInt40(byte[] data,int offset)
		{
			return  (long) ( ( ( (ulong) data[offset] ) | 
					( ( (ulong) data[offset+1] ) << 8 ) | 
					( ( (ulong) data[offset+2] ) << 16 ) | 
					( ( (ulong) data[offset+3] ) << 24 ) | 
					( ( (ulong) data[offset+4] ) << 32 )
					) - (long.MaxValue >> 24) );
		}
		
		public static uint ToUInt32(byte[] data,int offset)
		{
			return    ( (uint) data[offset] ) | 
					( ( (uint) data[offset+1] ) << 8 ) | 
					( ( (uint) data[offset+2] ) << 16 ) | 
					( ( (uint) data[offset+3] ) << 24 );
		}
		
		public static int ToInt32(byte[] data,int offset)
		{
			return    ( (int) data[offset] ) | 
					( ( (int) data[offset+1] ) << 8 ) | 
					( ( (int) data[offset+2] ) << 16 ) | 
					( ( (int) data[offset+3] ) << 24 );
		}
		
		public static uint ToUInt24(byte[] data,int offset)
		{
			return    ( (uint) data[offset] ) | 
					( ( (uint) data[offset+1] ) << 8 ) | 
					( ( (uint) data[offset+2] ) << 16 );
		}
		
		public static int ToInt24(byte[] data,int offset)
		{
			return  (int) ( ( ( (uint) data[offset] ) | 
					( ( (uint) data[offset+1] ) << 8 ) | 
					( ( (uint) data[offset+2] ) << 16 )
					) - (int.MaxValue >> 8) );
		}
		
		public static ushort ToUInt16(byte[] data,int offset)
		{
			return  (ushort) ( ( (uint) data[offset] ) | 
							 ( ( (uint) data[offset+1] ) << 8 )
							 );
		}
		
		public static short ToInt16(byte[] data,int offset)
		{
			return  (short) ( ( (int) data[offset] ) | 
							 ( ( (int) data[offset+1] ) << 8 )
							 );
		}
		
		public static byte[] GetBytes(ulong value)
		{
			byte[] result=new byte[8];
			result[0]=(byte)value;
			result[1]=(byte) (value>>8);
			result[2]=(byte) (value>>16);
			result[3]=(byte) (value>>24);
			result[4]=(byte) (value>>32);
			result[5]=(byte) (value>>40);
			result[6]=(byte) (value>>48);
			result[7]=(byte) (value>>56);
			return result;
		}
		
		public static byte[] GetBytes(long value)
		{
			byte[] result=new byte[8];
			result[0]=(byte)value;
			result[1]=(byte) (value>>8);
			result[2]=(byte) (value>>16);
			result[3]=(byte) (value>>24);
			result[4]=(byte) (value>>32);
			result[5]=(byte) (value>>40);
			result[6]=(byte) (value>>48);
			result[7]=(byte) (value>>56);
			return result;
		}
		
		public static byte[] GetBytesU56(ulong value)
		{
			byte[] result=new byte[7];
			result[0]=(byte)value;
			result[1]=(byte) (value>>8);
			result[2]=(byte) (value>>16);
			result[3]=(byte) (value>>24);
			result[4]=(byte) (value>>32);
			result[5]=(byte) (value>>40);
			result[6]=(byte) (value>>48);
			return result;
		}
		
		public static byte[] GetBytes56(long value)
		{
			value+=(long.MaxValue>>8);
			byte[] result=new byte[7];
			result[0]=(byte)value;
			result[1]=(byte) (value>>8);
			result[2]=(byte) (value>>16);
			result[3]=(byte) (value>>24);
			result[4]=(byte) (value>>32);
			result[5]=(byte) (value>>40);
			result[6]=(byte) (value>>48);
			return result;
		}
		
		public static byte[] GetBytesU48(ulong value)
		{
			byte[] result=new byte[6];
			result[0]=(byte)value;
			result[1]=(byte) (value>>8);
			result[2]=(byte) (value>>16);
			result[3]=(byte) (value>>24);
			result[4]=(byte) (value>>32);
			result[5]=(byte) (value>>40);
			return result;
		}
		
		public static byte[] GetBytes48(long value)
		{
			value+=(long.MaxValue>>16);
			byte[] result=new byte[6];
			result[0]=(byte)value;
			result[1]=(byte) (value>>8);
			result[2]=(byte) (value>>16);
			result[3]=(byte) (value>>24);
			result[4]=(byte) (value>>32);
			result[5]=(byte) (value>>40);
			return result;
		}
		
		public static byte[] GetBytesU40(ulong value)
		{
			byte[] result=new byte[5];
			result[0]=(byte)value;
			result[1]=(byte) (value>>8);
			result[2]=(byte) (value>>16);
			result[3]=(byte) (value>>24);
			result[4]=(byte) (value>>32);
			return result;
		}
		
		public static byte[] GetBytes40(long value)
		{
			value+=(long.MaxValue>>24);
			byte[] result=new byte[5];
			result[0]=(byte)value;
			result[1]=(byte) (value>>8);
			result[2]=(byte) (value>>16);
			result[3]=(byte) (value>>24);
			result[4]=(byte) (value>>32);
			return result;
		}
		
		public static byte[] GetBytes(uint value)
		{
			byte[] result=new byte[4];
			result[0]=(byte)value;
			result[1]=(byte) (value>>8);
			result[2]=(byte) (value>>16);
			result[3]=(byte) (value>>24);
			return result;
		}
		
		public static byte[] GetBytes(int value)
		{
			byte[] result=new byte[4];
			result[0]=(byte)value;
			result[1]=(byte) (value>>8);
			result[2]=(byte) (value>>16);
			result[3]=(byte) (value>>24);
			return result;
		}
		
		public static byte[] GetBytesU24(uint value)
		{
			byte[] result=new byte[3];
			result[0]=(byte)value;
			result[1]=(byte) (value>>8);
			result[2]=(byte) (value>>16);
			return result;
		}
		
		public static byte[] GetBytes24(int value)
		{
			value+=(int.MaxValue>>8);
			byte[] result=new byte[3];
			result[0]=(byte)value;
			result[1]=(byte) (value>>8);
			result[2]=(byte) (value>>16);
			return result;
		}
		
		public static byte[] GetBytes(ushort value)
		{
			byte[] result=new byte[2];
			result[0]=(byte)value;
			result[1]=(byte) (value>>8);
			return result;
		}
		
		public static byte[] GetBytes(short value)
		{
			byte[] result=new byte[2];
			result[0]=(byte)value;
			result[1]=(byte) (value>>8);
			return result;
		}
		
		public static void GetBytes(ulong value,byte[] result,int offset)
		{
			result[offset]=(byte)value;
			result[offset+1]=(byte) (value>>8);
			result[offset+2]=(byte) (value>>16);
			result[offset+3]=(byte) (value>>24);
			result[offset+4]=(byte) (value>>32);
			result[offset+5]=(byte) (value>>40);
			result[offset+6]=(byte) (value>>48);
			result[offset+7]=(byte) (value>>56);
		}
		
		public static void GetBytes(long value,byte[] result,int offset)
		{
			result[offset]=(byte)value;
			result[offset+1]=(byte) (value>>8);
			result[offset+2]=(byte) (value>>16);
			result[offset+3]=(byte) (value>>24);
			result[offset+4]=(byte) (value>>32);
			result[offset+5]=(byte) (value>>40);
			result[offset+6]=(byte) (value>>48);
			result[offset+7]=(byte) (value>>56);
		}
		
		
		public static void GetBytesU56(ulong value,byte[] result,int offset)
		{
			result[offset]=(byte)value;
			result[offset+1]=(byte) (value>>8);
			result[offset+2]=(byte) (value>>16);
			result[offset+3]=(byte) (value>>24);
			result[offset+4]=(byte) (value>>32);
			result[offset+5]=(byte) (value>>40);
			result[offset+6]=(byte) (value>>48);
		}
		
		public static void GetBytes56(long value,byte[] result,int offset)
		{
			value+=(long.MaxValue>>8);
			result[offset]=(byte)value;
			result[offset+1]=(byte) (value>>8);
			result[offset+2]=(byte) (value>>16);
			result[offset+3]=(byte) (value>>24);
			result[offset+4]=(byte) (value>>32);
			result[offset+5]=(byte) (value>>40);
			result[offset+6]=(byte) (value>>48);
		}
		
		
		public static void GetBytesU48(ulong value,byte[] result,int offset)
		{
			result[offset]=(byte)value;
			result[offset+1]=(byte) (value>>8);
			result[offset+2]=(byte) (value>>16);
			result[offset+3]=(byte) (value>>24);
			result[offset+4]=(byte) (value>>32);
			result[offset+5]=(byte) (value>>40);
		}
		
		public static void GetBytes48(long value,byte[] result,int offset)
		{
			value+=(long.MaxValue>>16);
			result[offset]=(byte)value;
			result[offset+1]=(byte) (value>>8);
			result[offset+2]=(byte) (value>>16);
			result[offset+3]=(byte) (value>>24);
			result[offset+4]=(byte) (value>>32);
			result[offset+5]=(byte) (value>>40);
		}
		
		public static void GetBytesU40(ulong value,byte[] result,int offset)
		{
			result[offset]=(byte)value;
			result[offset+1]=(byte) (value>>8);
			result[offset+2]=(byte) (value>>16);
			result[offset+3]=(byte) (value>>24);
			result[offset+4]=(byte) (value>>32);
		}
		
		public static void GetBytes40(long value,byte[] result,int offset)
		{
			value+=(long.MaxValue>>24);
			result[offset]=(byte)value;
			result[offset+1]=(byte) (value>>8);
			result[offset+2]=(byte) (value>>16);
			result[offset+3]=(byte) (value>>24);
			result[offset+4]=(byte) (value>>32);
		}
		
		public static void GetBytes(uint value,byte[] result,int offset)
		{
			result[offset]=(byte)value;
			result[offset+1]=(byte) (value>>8);
			result[offset+2]=(byte) (value>>16);
			result[offset+3]=(byte) (value>>24);
		}
		
		public static void GetBytes(int value,byte[] result,int offset)
		{
			result[offset]=(byte)value;
			result[offset+1]=(byte) (value>>8);
			result[offset+2]=(byte) (value>>16);
			result[offset+3]=(byte) (value>>24);
		}
		
		public static void GetBytesU24(uint value,byte[] result,int offset)
		{
			result[offset]=(byte)value;
			result[offset+1]=(byte) (value>>8);
			result[offset+2]=(byte) (value>>16);
		}
		
		public static void GetBytes24(int value,byte[] result,int offset)
		{
			value+=(int.MaxValue>>8);
			result[offset]=(byte)value;
			result[offset+1]=(byte) (value>>8);
			result[offset+2]=(byte) (value>>16);
		}
		
		public static void GetBytes(ushort value,byte[] result,int offset)
		{
			result[offset]=(byte)value;
			result[offset+1]=(byte) (value>>8);
		}
		
		public static void GetBytes(short value,byte[] result,int offset)
		{
			result[offset]=(byte)value;
			result[offset+1]=(byte) (value>>8);
		}
		
	}

}