TrimArray() simplification
[NovacoinLibrary.git] / Novacoin / VarInt.cs
index edca418..c3520ba 100644 (file)
@@ -18,7 +18,7 @@
 
 using System;
 using System.Collections.Generic;
-using System.Linq;
+using System.IO;
 
 namespace Novacoin
 {
@@ -31,9 +31,9 @@ namespace Novacoin
         /// </summary>
         /// <param name="n">Unsigned integer value</param>
         /// <returns>Byte sequence</returns>
-        public static IList<byte> EncodeVarInt(ulong n)
+        public static byte[] EncodeVarInt(ulong n)
         {
-            List<byte> resultBytes = new List<byte>();
+            var resultBytes = new List<byte>();
 
             if (n <= 0xfc)
             {
@@ -59,7 +59,7 @@ namespace Novacoin
                 }
                 else
                 {
-                    // ulong flag
+                    // long flag
                     prefix = 0xff;
                     valueBytes = BitConverter.GetBytes(n);
                 }
@@ -68,7 +68,7 @@ namespace Novacoin
                 resultBytes.AddRange(valueBytes);
             }
 
-            return resultBytes;
+            return resultBytes.ToArray();
         }
 
         /// <summary>
@@ -78,11 +78,31 @@ namespace Novacoin
         /// </summary>
         /// <param name="n">Integer value</param>
         /// <returns>Byte sequence</returns>
-        public static IList<byte> EncodeVarInt(long n)
+        public static byte[] EncodeVarInt(long n)
         {
             return EncodeVarInt((ulong)n);
         }
 
+        public static uint GetEncodedSize(long n)
+        {
+            if (n <= 0xfc)
+            {
+                return 1;
+            }
+            else if (n <= ushort.MaxValue)
+            {
+                return 3;
+            }
+            else if (n <= uint.MaxValue)
+            {
+                return 5;
+            }
+            else
+            {
+                return 9;
+            }
+        }
+
         /// <summary>
         /// Decodes integer value from compact representation
         /// 
@@ -90,25 +110,45 @@ namespace Novacoin
         /// </summary>
         /// <param name="bytes">Byte sequence</param>
         /// <returns>Integer value</returns>
-        public static ulong DecodeVarInt(IList<byte> bytes)
+        public static long DecodeVarInt(byte[] bytes)
         {
-            byte prefix = bytes[0];
+            var prefix = bytes[0];
 
-            bytes.RemoveAt(0); // Remove prefix
+            if (bytes.Length > 1)
+            {
+                var bytesArray = new byte[bytes.Length - 1];
+                Array.Copy(bytes, 1, bytesArray, 0, bytesArray.Length);
+
+                switch (prefix)
+                {
+                    case 0xfd: // ushort flag
+                        return BitConverter.ToUInt16(bytesArray, 0);
+                    case 0xfe: // uint flag
+                        return BitConverter.ToUInt32(bytesArray, 0);
+                    case 0xff: // long flag
+                        return BitConverter.ToInt64(bytesArray, 0);
+                }
+            }
+            
+            return prefix; // Values lower than 0xfd are stored directly
+        }
 
-            byte[] bytesArray = bytes.ToArray();
+        public static long ReadVarInt(ref BinaryReader reader)
+        {
+            byte prefix = reader.ReadByte();
 
             switch (prefix)
             {
-                case 0xfd: // ushort flag
-                    return BitConverter.ToUInt16(bytesArray, 0);
-                case 0xfe: // uint flag
-                    return BitConverter.ToUInt32(bytesArray, 0);
-                case 0xff: // ulong flag
-                    return BitConverter.ToUInt64(bytesArray, 0);
+                case 0xfd: // ushort
+                    return reader.ReadUInt16();
+                case 0xfe: // uint
+                    return reader.ReadUInt32();
+                case 0xff: // long
+                    return reader.ReadInt64();
                 default:
                     return prefix;
             }
         }
+
     }
 }