BTC交易数据 - VarInt
全名是
Variable-length Integer
,是一种基于动态产犊表示整数的编码方式,常用于比特币协议中。
编码规则
- 如果需要表示的数值小于 253(16进制:0xfd),就用一个字节表示整数值。该字节的数值就是需要表示的值
- 如果需要表示的数值大于等于 253(16进制:0xfd)且 小于等于 65535(16进制:0xffff),使用三个字节表示整数值。编码时用第一个字节固定为 0xfd,后面两个字节使用小端模式表示值。
- 如果需要表示的数值大于 65535(16进制:0xfe)且 小于等于 0xffffffff(4,294,967,295),则使用五个字节表示,第一个字节为0xfe,后面四个字节为整数值的小端表示使用三个字节表示整数值。编码时第一个字节固定为 0xfe,后面四个字节使用小端模式表示值。
- 如果整数值大于 0xffffffff(4,294,967,295),则使用九个字节表示,第一个字节为0xff,后面八个字节为整数值的小端表示。
编解码脚本
def encode_varint(value):
if value < 0xfd:
return bytes([value])
elif value <= 0xffff:
return b'\xfd' + value.to_bytes(2, 'little')
elif value <= 0xffffffff:
return b'\xfe' + value.to_bytes(4, 'little')
else:
return b'\xff' + value.to_bytes(8, 'little')
def decode_varint(data):
first_byte = data[0]
if first_byte < 0xfd:
return first_byte, 1
elif first_byte == 0xfd:
return int.from_bytes(data[1:3], 'little'), 3
elif first_byte == 0xfe:
return int.from_bytes(data[1:5], 'little'), 5
elif first_byte == 0xff:
return int.from_bytes(data[1:9], 'little'), 9
# 示例
# 这里输入整数值
value = 100000
encoded_varint = encode_varint(value)
decoded_varint, length = decode_varint(encoded_varint)
print("Original Value:", value)
print("Encoded VarInt:", "0x" + encoded_varint.hex())
print("Decoded VarInt:", decoded_varint)
print("Length:", length)
ecoded VarInt:", decoded_varint)
print("Length:", length)