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) ]) ]) ))