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
```