2 using System.Collections.Generic;
5 using System.Threading.Tasks;
12 /// Encodes unsigned integer value into compact representation.
14 /// See https://bitcoin.org/en/developer-reference#compactsize-unsigned-integers for additional information.
16 /// <param name="n">Unsigned integer value</param>
17 /// <returns>Byte sequence</returns>
18 public static IList<byte> EncodeVarInt(ulong n)
20 List<byte> resultBytes = new List<byte>();
24 // Values up to 0xfc are stored directly without any prefix
25 resultBytes.Add((byte)n);
32 if (n <= ushort.MaxValue)
36 valueBytes = BitConverter.GetBytes((ushort)n);
38 else if (n <= uint.MaxValue)
42 valueBytes = BitConverter.GetBytes((uint)n);
48 valueBytes = BitConverter.GetBytes(n);
51 resultBytes.Add(prefix);
52 resultBytes.AddRange(valueBytes);
59 /// Encodes integer value into compact representation.
61 /// See https://bitcoin.org/en/developer-reference#compactsize-unsigned-integers for additional information.
63 /// <param name="n">Integer value</param>
64 /// <returns>Byte sequence</returns>
65 public static IList<byte> EncodeVarInt(long n)
67 return EncodeVarInt((ulong)n);
71 /// Decodes integer value from compact representation
73 /// See https://bitcoin.org/en/developer-reference#compactsize-unsigned-integers for additional information.
75 /// <param name="bytes">Byte sequence</param>
76 /// <returns>Integer value</returns>
77 public static ulong DecodeVarInt(IList<byte> bytes)
79 byte prefix = bytes[0];
81 bytes.RemoveAt(0); // Remove prefix
83 byte[] bytesArray = bytes.ToArray();
87 case 0xfd: // ushort flag
88 return BitConverter.ToUInt16(bytesArray, 0);
89 case 0xfe: // uint flag
90 return BitConverter.ToUInt32(bytesArray, 0);
91 case 0xff: // ulong flag
92 return BitConverter.ToUInt64(bytesArray, 0);