Difference between revisions of "VarInt"

m
Line 5: Line 5:
 
==Using VarInts==
 
==Using VarInts==
  
When expressing an integer between zero and <code>0xFC</code> (252) the value itself can be used expressed in uint8_t format.
+
When expressing an integer between zero and <code>0xFC</code> (252) the value itself can be used and expressed in uint8_t format.
  
 
When expressing an integer value greater than <code>0xFC</code> but less than or equal to <code>0xFFFF</code> (65,535), the varint is <code>0xFDXXXX</code> where XXXX represents the two byte integer in uint16_t format.
 
When expressing an integer value greater than <code>0xFC</code> but less than or equal to <code>0xFFFF</code> (65,535), the varint is <code>0xFDXXXX</code> where XXXX represents the two byte integer in uint16_t format.

Revision as of 02:42, 18 November 2020

A VarInt or "Variable Integer" is an integer format used widely in Bitcoin to indicate the lengths of fields within transaction, block and peer-to-peer network data.

A VarInt is a variable length field 1, 3, 5 or 9 bytes in length dependent on the size of the object being defined. The VarInt format is used as it is space efficient over simply using an 8-byte field where variable length objects are used.

Using VarInts

When expressing an integer between zero and 0xFC (252) the value itself can be used and expressed in uint8_t format.

When expressing an integer value greater than 0xFC but less than or equal to 0xFFFF (65,535), the varint is 0xFDXXXX where XXXX represents the two byte integer in uint16_t format.

When expressing an integer value greater than 0xFFFF but less than or equal to 0xFFFFFFFF (4,294,967,295), the varint is 0xFEXXXXXXXX where XXXXXXXX represents the 4 byte integer in uint32_t format.

When expressing an integer value greater than 0xFFFFFFFF but less than or equal to 0xFFFFFFFFFFFFFFFF (18,446,744,073,709,551,615), the varint is 0xFFXXXXXXXXXXXXXXXX where XXXXXXXXXXXXXXXX represents the 8 byte integer in uint64_t format.

References with Examples

Value Range

Example Value
Size Range

Example Size
VarInt Format

Example VarInt
0 <= Value <= 252 (0xFC)

e.g. 187 (0xBB)
1 byte

1 byte
uint8_t

0xBB
253 <= Value <= 65,535 (0xFFFF)

e.g. 255 (0xFF)

e.g. 13,337 (0x3419)
1 - 2 bytes

1 byte but greater than 0xFC

2 bytes
0xFD + number as uint16_t

0xFD00FF

0xFD3419
65,536 <= Value <= ‭4,294,967,295‬ (0xFFFFFFFF)

e.g. 14,435,729 (0xDC4591)

e.g. 134,250,981 (0x80081E5)
3 - 4 bytes

3 bytes

4 bytes
0xFE + number as uint32_t

0xFE00DC4591

0xFE080081E5
4,294,967,296 <= value <= ‭18,446,744,073,709,551,615 (0xFFFFFFFFFFFFFFFF)

e.g.198,849,843,832,919 (0xB4DA564E2857)

e.g. 5,473,425,651,754,713,432 (0x‭4BF583A17D59C158‬)
5 - 8 bytes

6 bytes

8 bytes
0xFF + number as uint64_t

0xFF0000B4DA564E2857

0xFF4BF583A17D59C158