Hexadecimal bytes are not Unicode code points
Hexadecimal is a compact way to display bytes. Two hex digits represent one byte, from 00 to FF. A plain English letter often occupies one byte in UTF-8, which makes a short example look like a character-by-character substitution. That shortcut stops working for much of the text people actually write. An accented letter can take two bytes; an emoji can take four or form a longer sequence.
The code point U+00E9 identifies the character é. Its UTF-8 bytes are C3 A9, not E9. Feeding the single byte E9 into a strict UTF-8 decoder is therefore an error, even though the hex itself is valid. If a log was produced using a legacy encoding, establish that encoding at the source rather than guessing until the output looks plausible.
This converter checks hexadecimal syntax before attempting character decoding. A compact run such as 4869 is accepted. So are complete groups such as 48 69, 48:69 and 0x48,0x69. An odd number of digits in a group is rejected. Address columns, escaped programming-language strings and the printable side column of a full hexdump are outside this parser; paste only the byte data.
Keep the numeric and text tasks separate. Hex FF represents the integer 255, but it is not a valid standalone UTF-8 text byte. Use the number-base converter to calculate that value, and this tool when the bytes encode a message. Successful text can continue into the existing document tools. NULL characters remain in downloads, although the document handoff rejects them.