/// <summary> /// Encoded an integer to save space. /// </summary> /// <remarks> /// Integer can be encoded depending on the represented value to save space. Variable length integers always precede /// an array/vector of a type of data that may vary in length. Longer numbers are encoded in little endian. /// </remarks> /// <specification>https://en.bitcoin.it/wiki/Protocol_specification#Variable_length_integer</specification> /// <example> /// nodejs: https://c9.io/raistlinthewiz/bitcoin-coinbase-varint-nodejs /// </example> /// <returns></returns> public static byte[] VarInt(UInt32 value) { if (value < 0xfd) return new[] { (byte)value }; byte[] result; using (var stream = new MemoryStream()) { if (value < 0xffff) { stream.WriteValueU8(0xfd); stream.WriteValueU16(((UInt16)value).LittleEndian()); } else if (value < 0xffffffff) { stream.WriteValueU8(0xfe); stream.WriteValueU32(value.LittleEndian()); } else { stream.WriteValueU8(0xff); stream.WriteValueU16(((UInt16)value).LittleEndian()); } result = stream.ToArray(); } return result; }