Looking inside the "After" file in the Samples.zip you provided seems to indicate that you're outputting the same string twice, or something...
I would suggest you start with smaller files to test on, and to use the debugger to step in.
Actually, having tried that myself, i think i found out what's going on: you're using "nextOffset - currentOffset" as a stringLength, but it's actually a BYTE-Length... The char array will end (have a '\0' inside it) after only half this number, and when outputting you'll also get the second half, that you haven't yet read.
[Edit] Posting the code from my comment below, for better formatting:
int index;
for (index = 0; index < stringLength; ++index) if (chars[index] == '\0') break;
if (index < stringLength) {
char[] relevantPart = new char[index];
Array.Copy(chars, relevantPart, index);
chars = relevantPart;
}