87 lines
2.2 KiB
Python
87 lines
2.2 KiB
Python
import random
|
|
|
|
def int_to_bin(num, l):
|
|
return bin(num)[2:].zfill(l)
|
|
|
|
def literal(ver, num):
|
|
bin_num = bin(num)[2:]
|
|
bin_num = bin_num.zfill((len(bin_num)+3) // 4 * 4)
|
|
return int_to_bin(ver, 3) + int_to_bin(4, 3) + ''.join(('1' if i+4 < len(bin_num) else "0") + bin_num[i:i+4] for i in range(0, len(bin_num), 4))
|
|
|
|
def sub_by_length(ver, op, subs):
|
|
bin_sub = ''.join(subs)
|
|
bin_len = int_to_bin(len(bin_sub), 15)
|
|
return int_to_bin(ver, 3) + int_to_bin(op, 3) + '0' + bin_len + bin_sub
|
|
|
|
def sub_by_amount(ver, op, subs):
|
|
bin_sub = ''.join(subs)
|
|
bin_len = int_to_bin(len(subs), 11)
|
|
return int_to_bin(ver, 3) + int_to_bin(op, 3) + '1' + bin_len + bin_sub
|
|
|
|
def bin_to_hex(bin_num):
|
|
pad_len = (len(bin_num)+7) // 8 * 8 - len(bin_num)
|
|
bin_num = bin_num + '0' * pad_len
|
|
return ''.join(hex(int(bin_num[i:i+4], 2))[2:] for i in range(0, len(bin_num), 4)).upper()
|
|
|
|
print(bin_to_hex(
|
|
literal(6, 2021)
|
|
) == 'D2FE28')
|
|
print(bin_to_hex(
|
|
sub_by_length(1, 6, [
|
|
literal(6, 10),
|
|
literal(2, 20)
|
|
])
|
|
) == '38006F45291200')
|
|
print(bin_to_hex(
|
|
sub_by_amount(7, 3, [
|
|
literal(2, 1),
|
|
literal(4, 2),
|
|
literal(1, 3)
|
|
])
|
|
) == 'EE00D40C823060')
|
|
print(bin_to_hex(
|
|
sub_by_amount(4, 2, [
|
|
sub_by_amount(1, 2, [
|
|
sub_by_length(5, 2, [
|
|
literal(6, 15)
|
|
])
|
|
])
|
|
])
|
|
) == '8A004A801A8002F478')
|
|
print(bin_to_hex(
|
|
sub_by_amount(3, 0, [
|
|
sub_by_length(0, 0, [
|
|
literal(0, 10),
|
|
literal(5, 11)
|
|
]),
|
|
sub_by_amount(1, 0, [
|
|
literal(0, 12),
|
|
literal(3, 13)
|
|
])
|
|
])
|
|
) == '620080001611562C8802118E34')
|
|
print(bin_to_hex(
|
|
sub_by_length(3, 0, [
|
|
sub_by_length(0, 0, [
|
|
literal(0, 1000),
|
|
literal(5, 51641)
|
|
]),
|
|
sub_by_length(1, 0, [
|
|
literal(0, 65213),
|
|
literal(3, 213511)
|
|
]),
|
|
sub_by_length(1, 0, [
|
|
literal(0, 65213),
|
|
literal(3, 213511)
|
|
]),
|
|
sub_by_length(1, 0, [
|
|
literal(0, 65213),
|
|
literal(3, 213511)
|
|
]),
|
|
sub_by_length(1, 0, [
|
|
literal(0, 65213),
|
|
literal(3, 213511)
|
|
])
|
|
])
|
|
))
|