using System;
using System.Collections.Generic;
-using System.Linq;
+using System.IO;
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)
{
resultBytes.AddRange(valueBytes);
}
- return resultBytes;
+ return resultBytes.ToArray();
}
/// <summary>
/// </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
///
/// </summary>
/// <param name="bytes">Byte sequence</param>
/// <returns>Integer value</returns>
- public static ulong DecodeVarInt(IList<byte> bytes)
+ public static ulong 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: // ulong flag
+ return BitConverter.ToUInt64(bytesArray, 0);
+ }
+ }
+
+ return prefix; // Values lower than 0xfd are stored directly
+ }
- byte[] bytesArray = bytes.ToArray();
+ public static ulong 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: // ulong
+ return reader.ReadUInt64();
default:
return prefix;
}
}
+
}
}