X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=Novacoin%2FInterop.cs;h=54768cfe4a3f68f71df3cb9294d1a029a382ae17;hb=HEAD;hp=24058904eaa9d853ee78babf88f91984cf9892f2;hpb=07221c9bf3606c08e8c7d49a53b2f49bde06bb5c;p=NovacoinLibrary.git diff --git a/Novacoin/Interop.cs b/Novacoin/Interop.cs index 2405890..54768cf 100644 --- a/Novacoin/Interop.cs +++ b/Novacoin/Interop.cs @@ -1,219 +1,120 @@ -using System; +/** + * Novacoin classes library + * Copyright (C) 2015 Alex D. (balthazar.ad@gmail.com) + + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +using System; using System.Collections.Generic; using System.Linq; using System.Text; -using System.Threading.Tasks; namespace Novacoin { - public class InteropException : Exception - { - public InteropException() - { - } - - public InteropException(string message) - : base(message) - { - } - - public InteropException(string message, Exception inner) - : base(message, inner) - { - } - } - + /// + /// Miscellaneous functions + /// public class Interop { - public static byte[] LEBytes(ushort n) - { - byte[] resultBytes = BitConverter.GetBytes(n); - - if (!BitConverter.IsLittleEndian) - { - // Reverse array if we are on big-endian machine - Array.Reverse(resultBytes); - } - - return resultBytes; - } - - public static byte[] LEBytes(uint n) - { - byte[] resultBytes = BitConverter.GetBytes(n); - - if (!BitConverter.IsLittleEndian) - { - // Reverse array if we are on big-endian machine - Array.Reverse(resultBytes); - } - - return resultBytes; - } - - public static byte[] LEBytes(ulong n) - { - byte[] resultBytes = BitConverter.GetBytes(n); - - if (!BitConverter.IsLittleEndian) - { - // Reverse array if we are on big-endian machine - Array.Reverse(resultBytes); - } - - return resultBytes; - } - - public static byte[] BEBytes(ushort n) - { - byte[] resultBytes = BitConverter.GetBytes(n); - - if (BitConverter.IsLittleEndian) - { - // Reverse array if we are on little-endian machine - Array.Reverse(resultBytes); - } - - return resultBytes; - } - - public static byte[] BEBytes(uint n) + /// + /// Convert array of unsigned integers to array of bytes. + /// + /// Array of unsigned integer values. + /// Byte array + public static byte[] LEBytes(uint[] values) { - byte[] resultBytes = BitConverter.GetBytes(n); - - if (BitConverter.IsLittleEndian) - { - // Reverse array if we are on little-endian machine - Array.Reverse(resultBytes); - } + var result = new byte[values.Length * sizeof(uint)]; + Buffer.BlockCopy(values, 0, result, 0, result.Length); - return resultBytes; + return result; } - public static byte[] BEBytes(ulong n) + /// + /// Convert byte array to array of unsigned integers. + /// + /// Byte array. + /// Array of integers + public static uint[] ToUInt32Array(byte[] bytes) { - byte[] resultBytes = BitConverter.GetBytes(n); + var result = new uint[bytes.Length / sizeof(uint)]; + Buffer.BlockCopy(bytes, 0, result, 0, bytes.Length); - if (BitConverter.IsLittleEndian) - { - // Reverse array if we are on little-endian machine - Array.Reverse(resultBytes); - } - - return resultBytes; + return result; } - public static ushort LEBytesToUInt16(byte[] bytes) + /// + /// Reverse byte array + /// + /// Source array + /// Result array + public static byte[] ReverseBytes(byte[] source) { - if (bytes.Length != sizeof(ushort)) - { - throw new InteropException("Array size doesn't match the ushort data type."); - } + var b = new byte[source.Length]; - if (!BitConverter.IsLittleEndian) - { - // Reverse array if we are on big-endian machine - Array.Reverse(bytes); - } + source.CopyTo(b, 0); - return BitConverter.ToUInt16(bytes, 0); - } - - public static uint LEBytesToUInt32(byte[] bytes) - { - if (bytes.Length != sizeof(uint)) - { - throw new InteropException("Array size doesn't match the uint data type."); - } + Array.Reverse(b); - if (!BitConverter.IsLittleEndian) - { - // Reverse array if we are on big-endian machine - Array.Reverse(bytes); - } - - return BitConverter.ToUInt32(bytes, 0); + return b; } - public static ulong LEBytesToUInt64(byte[] bytes) + public static byte[] HexToArray(string hex) { - if (bytes.Length != sizeof(ulong)) - { - throw new InteropException("Array size doesn't match the ulong data type."); - } + int nChars = hex.Length; + var bytes = new byte[nChars / 2]; - if (!BitConverter.IsLittleEndian) + for (int i = 0; i < nChars; i += 2) { - // Reverse array if we are on big-endian machine - Array.Reverse(bytes); + bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16); } - return BitConverter.ToUInt64(bytes, 0); + return bytes; } - public static ushort BEBytesToUInt16(byte[] bytes) + public static byte[] TrimArray(byte[] bytes) { - if (bytes.Length != sizeof(ushort)) + int trimStart = bytes.Length - 1; + while (trimStart >= 0 && bytes[trimStart] == 0) { - throw new InteropException("Array size doesn't match the ushort data type."); + trimStart--; } - if (BitConverter.IsLittleEndian) - { - // Reverse array if we are on little-endian machine - Array.Reverse(bytes); - } - - return BitConverter.ToUInt16(bytes, 0); + return bytes.Take(trimStart + 1).ToArray(); } - public static uint BEBytesToUInt32(byte[] bytes) + public static byte[] AppendWithZeros(byte[] bytes, int nTargetLen=32) { - if (bytes.Length != sizeof(uint)) - { - throw new InteropException("Array size doesn't match the uint data type."); - } + var result = new byte[nTargetLen]; + bytes.CopyTo(result, 0); - if (BitConverter.IsLittleEndian) - { - // Reverse array if we are on little-endian machine - Array.Reverse(bytes); - } - - return BitConverter.ToUInt32(bytes, 0); + return result; } - public static ulong BEBytesToUInt64(byte[] bytes) + public static string ToHex(byte[] bytes) { - if (bytes.Length != sizeof(ulong)) - { - throw new InteropException("Array size doesn't match the ulong data type."); - } - - if (BitConverter.IsLittleEndian) + var sb = new StringBuilder(); + foreach (var b in bytes) { - // Reverse array if we are on little-endian machine - Array.Reverse(bytes); + sb.AppendFormat("{0:x2}", b); } - - return BitConverter.ToUInt64(bytes, 0); - } - - public static IEnumerable ParseHex(string hex) - { - return Enumerable.Range(0, hex.Length) - .Where(x => x % 2 == 0) - .Select(x => Convert.ToByte(hex.Substring(x, 2), 16)); + return sb.ToString(); } - public static string ToHex(IEnumerable bytes) + public static uint GetTime() { - StringBuilder sb = new StringBuilder(); - foreach (byte b in bytes) - { - sb.AppendFormat("{0:x2}", b); - } - return sb.ToString(); + return (uint)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; } } }