Thanks Maël. I certainly agree that collaberation is good. It also promotes learning from other's experience.
I'd not utilised AnsiLowerCase/AnsiUpperCase as I didn't consider the associated data files would have international character implications.
ie. The data files referenced are the included plain text .ini and .csv file content.
Being old-school, I'd utilised AnsiString on the basis that the subject matter (Hex strings and Assembly language mnemonics) are traditionally ASCII character based. But I don't profess to being experienced with international language / international character support (although I'm certainly familiar with Unicode).
Are you suggesting that someone could potentially create a new .csv (or .ini) file as a UTF-8 Unicode text file containing multi-byte characters?
I do however see that I should just trust the Delphi HexToBin handling of multi-byte characters (and that Length, of course, returns the actual character count). Being old-school, I'm always thinking of data at the byte level. LOL
Your {$IF RTLVersion <= 27.0} directive is certainly a non-intrusive resolution for older Delphi version support.
My only remaining question is to understand why you have changed SmallInt types to Int16? Delphi Int16 is an alias of SmallInt (ie. type Int16 = SmallInt;).
Is this simply your preference for more clearly specifying a 2-byte integer type?
Otherwise, I'm happy to roll your suggestions into the published source (I'll just await the clarification on your Int16 changes).