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 = Interop.LEBytes((ushort)n);
38 else if (n <= uint.MaxValue)
42 valueBytes = Interop.LEBytes((uint)n);
48 valueBytes = Interop.LEBytes(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
82 byte[] bytesArray = bytes.ToArray();
84 if (!BitConverter.IsLittleEndian)
86 // Values are stored in little-endian order
87 Array.Reverse(bytesArray);
92 case 0xfd: // ushort flag
93 return BitConverter.ToUInt16(bytesArray, 0);
94 case 0xfe: // uint flag
95 return BitConverter.ToUInt32(bytesArray, 0);
96 case 0xff: // ulong flag
97 return BitConverter.ToUInt64(bytesArray, 0);