Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Stream, string and null character

I have a stream which contains several \0 inside it. I have to replace textual parts of this stream, but when I do

StreamReader reader = new StreamReader(stream);
string text = reader.ReadToEnd();

text only contains the beginning of the stream (because of the \0 character). So

text = text.Replace(search, replace);
StreamWriter writer = new StreamWriter(stream);
writer.Write(text);

will not do the expected job since I don't parse the "full" stream. Any idea on how to get access to the full data and replace some textual parts ?

EDIT : An example of what I see on notepad

stream
H‰­—[oã6…ÿÛe)Rêq%ÙrlËñE±“-úàÝE[,’íKÿþŽDjxÉ6ŒÅ"XkÏáGqF   að÷óð!SN>¿¿‰È†/$ËÙpñ<^HVÀHuñ'¹¿à»U?`äŸ?
¾fØø(Ç,ükøéàâ+ùõ7øø2ÜTJ«¶Ïäd×SÿgªŸF_ß8ÜU@<Q¨|œp6åâ-ªÕ]³®7Ûn¹ÚÝ|‰,¨¹^ãI©…Ë<UIÐI‡Û©* Ǽ,,ý¬5O->qä›Ü
endstream 
endobj
8 0 obj
<<
/Type /FontDescriptor
/FontName /Verdana
/Ascent 765
/Descent -207
/CapHeight 1489
/Flags 32
/ItalicAngle 0
/StemV 86
/StemH 0
/FontBBox [ -560 -303 1523 1051 ]
/FontFile2 31 0 R
>>
endobj
9 0 obj

And I want to replace /FontName /Verdana by /FontName /Arial on the fly, for example.

like image 636
Nicolas Voron Avatar asked May 10 '26 09:05

Nicolas Voron


2 Answers

Ah, now we're getting to it...

This file a pdf

Then it's not a text file. That's a binary file, and should be treated as a binary file. Using StreamReader on it will lose data. You'll need to use a different API to access the data in it - one which understands the PDF format. Have a look at iTextSharp or PDFTron.

like image 112
Jon Skeet Avatar answered May 11 '26 23:05

Jon Skeet


I can't duplicate your results. The code below creates a string with a \0 in it, writes to file, and then reads it back. The resulting string has the \0 in it:

        string s = "hello\x0world";
        File.WriteAllText("foo.txt", s);
        string t;
        using (var f = new StreamReader("foo.txt"))
        {
            t = f.ReadToEnd();
        }
        Console.WriteLine(t == s);  // prints "True"

I get the same results if I do var t = File.ReadAllText("foo.txt");

like image 30
Jim Mischel Avatar answered May 11 '26 23:05

Jim Mischel