I'm trying to reverse a decoding function in order to produce the function for encoding. So far I have ported the decoding function from ASM X86 to Python and it's working fine. My problem is I'm not able to reverse the function because I don't understand what the code does with the bitwise operations. I'd like some help to simplify/understand the function and reverse it. My code so far: ``` def text_to_hex(text): with open("ENCODE_ARRAY.bin", mode='rb') as file: TEXT_ENCODE_ARRAY = file.read() decoded = [] text_char_index = 0 i = 0 HARDCODED_LIMIT = 0x26 text_len = len(text) while i < HARDCODED_LIMIT: if text_char_index >= text_len: break eax = ord(text[text_char_index]) text_char_index += 1 eax = TEXT_ENCODE_ARRAY[eax] if eax < 0: break esi = eax & 0xFF esi = esi << 0xB eax = ord(text[text_char_index]) text_char_index += 1 eax = TEXT_ENCODE_ARRAY[eax] if eax < 0: break eax = eax & 0xFF eax = eax << 6 esi = esi | eax if i == HARDCODED_LIMIT: break eax = esi eax = eax >> 8 decoded.append(chr(eax)) i += 1 if text_char_index >= text_len: break eax = ord(text[text_char_index]) text_char_index += 1 eax = eax & 0xFF eax = TEXT_ENCODE_ARRAY[eax] if eax < 0: break ebx = eax & 0xFF ebx = ebx + ebx ebx = ebx | esi ebx = ebx << 0x18 eax = ord(text[text_char_index]) text_char_index += 1 eax = TEXT_ENCODE_ARRAY[eax] if eax < 0: break eax = eax & 0xFF eax = eax << 0x14 ebx = ebx | eax if i == HARDCODED_LIMIT: break eax = ebx eax = eax >> 0x18 eax = eax & 0xFF decoded.append(chr(eax)) i += 1 if text_char_index >= text_len: break eax = ord(text[text_char_index]) text_char_index += 1 eax = TEXT_ENCODE_ARRAY[eax] if eax < 0: break eax = eax & 0xFF eax = eax << 0xF ebx = ebx | eax if i == HARDCODED_LIMIT: break eax = ebx eax = eax >> 0x10 eax = eax & 0xFF decoded.append(chr(eax)) i += 1 if text_char_index >= text_len: break eax = ord(text[text_char_index]) text_char_index += 1 eax = TEXT_ENCODE_ARRAY[eax] if eax < 0: break eax = eax & 0xFF eax = eax << 0xA ebx = ebx | eax eax = ord(text[text_char_index]) text_char_index += 1 eax = TEXT_ENCODE_ARRAY[eax] if eax < 0: break eax = eax << 5 ebx = ebx | eax if i == HARDCODED_LIMIT: break eax = ebx eax = eax >> 8 eax = eax & 0xFF decoded.append(chr(eax)) i += 1 if text_char_index >= text_len: break eax = ord(text[text_char_index]) text_char_index += 1 eax = TEXT_ENCODE_ARRAY[eax] if eax < 0: break if i == HARDCODED_LIMIT: break ebx = ebx | eax ebx = ebx & 0xFF decoded.append(chr(ebx)) i += 1 #END WHILE return decoded ```