public static long WriteCompactToBuf(CompactIntegerLEBytes ci, ref byte[] buf, long offset) { for (int i = 0; i < ci.Length; ++i) { buf[offset + i] = ci.Bytes[i]; } return(ci.Length); }
public static CompactIntegerLEBytes EncodeCompactInteger(BigInteger n) { CompactIntegerLEBytes b = new CompactIntegerLEBytes(); b.Bytes = new byte[64]; if (n <= 63) { b.Length = 1; b.Bytes[0] = (byte)(n << 2); } else if (n <= 0x3FFF) { b.Length = 2; b.Bytes[0] = (byte)(((n & 0x3F) << 2) | 0x01); b.Bytes[1] = (byte)((n & 0xFC0) >> 6); } else if (n <= 0x3FFFFFFF) { b.Length = 4; b.Bytes[0] = (byte)(((n & 0x3F) << 2) | 0x02); n >>= 6; for (int i = 1; i < 4; ++i) { b.Bytes[i] = (byte)(n & 0xFF); n >>= 8; } } else { // Big integer mode b.Length = 1; int byteNum = 1; while (n > 0) { b.Bytes[byteNum++] = (byte)(n & 0xFF); n >>= 8; } b.Length = byteNum; b.Bytes[0] = (byte)(((byteNum - 5) << 2) | 0x03); } b.Bytes = b.Bytes.AsMemory().Slice(0, (int)b.Length).ToArray(); return(b); }