05 prefix indicates that this serialization comes from the
PACK assembly instruction, and the next byte
00 in case of integers (
tez) indicates that the type is integer. So the numbers are represented by the bytes
1000000n (1 million)
Reading each byte from left to right, the 1st indicates whether more bytes are coming. The 2nd bit of the first byte indicates if the number is positive or negative, 1 indicates negative, and 0 positive.
0x01 = 0b00000001, 1st bit is 0, and 2nd bit is zero indicating that no more bytes are coming and that this is a positive number. The remaining six bits give the value:
0b000001 = 0x01 = 1.
0x80897a = 0b10000000,0b10001001,0b01111010
The first bit in each byte indicates that this value is represented by three bytes. The 2nd bit in the 1st byte indicates that this is a positive number. The remaining bits are then
0b000000, 0b0001001, 0b1111010. Reversing the byte order (because little-endian) we get:
From the documentation we get:
A variable length sequence of bytes, encoding a Zarith number. Each
byte has a running unary size bit: the most significant bit of each
byte tells is this is the last byte in the sequence (0) or if there is
more to read (1). The second most significant bit of the first byte is
reserved for the sign (positive if zero). Size and sign bits ignored,
data is then the binary representation of the absolute value of the
number in little endian order.
The documentation for this can be found by running
tezos-codec describe alpha.script.expr binary schema For output at the time of reading, see: gist.github.com/smondet/f5b785a6bbe6adb431fd7bca5e6df91a