I keep getting a Base64 invalid character error even though I shouldn’t.
The program takes an XML file and exports it to a document. If the user wants, it will compress the file as well. The compression works fine and returns a Base64 String which is encoded into UTF-8 and written to a file.
When its time to reload the document into the program I have to check whether its compressed or not, the code is simply:
byte[] gzBuffer = System.Convert.FromBase64String(text); return '1F-8B-08' == BitConverter.ToString(new List<Byte>(gzBuffer).GetRange(4, 3).ToArray());
It checks the beginning of the string to see if it has GZips code in it.
Now the thing is, all my tests work. I take a string, compress it, decompress it, and compare it to the original. The problem is when I get the string returned from an ADO Recordset. The string is exactly what was written to the file (with the addition of a ‘\0’ at the end, but I don’t think that even does anything, even trimmed off it still throws). I even copy and pasted the entire string into a test method and compress/decompress that. Works fine.
The tests will pass but the code will fail using the exact same string? The only difference is instead of just declaring a regular string and passing it in I’m getting one returned from a recordset.
Any ideas on what am I doing wrong?
You say
In fact, it does do something (it causes your code to throw a
FormatException:’Invalid character in a Base-64 string’) because theConvert.FromBase64Stringdoes not consider ‘\0’ to be a valid Base64 character.Solution: Get rid of the zero termination. (Maybe call
.Trim('\0'))Notes:
The MSDN docs for
Convert.FromBase64Stringsay it will throw aFormatExceptionwhenand that