流,字符串和空字符

3
我是一名有用的助手,可以为您翻译以下内容:

我有一个流,其中包含几个\0。我必须替换这个流的文本部分,但当我这样做时

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

text 只包含流的开头(因为有 \0 字符)。所以

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

由于我没有解析“完整”的流,所以无法执行预期的工作。有没有办法获取完整数据并替换某些文本部分?

编辑:以下是在记事本中看到的示例。

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

我希望你能帮助我实时地将/FontName /Verdana替换为/FontName /Arial,例如。


1
不,ReadToEnd并不使用\0作为“流结束”字符。但是它可能会影响您的诊断。尝试打印长度。这些数据来自哪里?它们是否真的应该包含这些字符?您是否可能只是使用了错误的编码方式? - Jon Skeet
我承认我不确定这些字符是否存在,我只是怀疑。事实是 ReadToEnd() 没有给我完整的文件文本。这个文件是一个包含 stream ... endstream 部分的PDF文件。 - Nicolas Voron
啊,好的。要是一开始你就这么说就好了。看看我的回答。 - Jon Skeet
@NicolasVoron:你打算用这个 PDF 做什么?展示给用户看吗?提取文本? - Brian
@Brian 我尝试阅读的pdf是一种模板。我想修改其中一些标记。没有显示或文本提取,只需更改一些在记事本上可见的已知标记值(请参见我的编辑)。 - Nicolas Voron
2个回答

2

我无法复制您的结果。以下代码创建了一个包含 \0 的字符串,将其写入文件,然后读取它。结果字符串中包含 \0

        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"

如果我这样做:var t = File.ReadAllText("foo.txt");,那么我将会得到相同的结果。

所以,正如 @jonskeet 所说,这不是阻止我的 \0。我会编辑我的帖子。 - Nicolas Voron

2

啊,现在我们开始进入正题了...

这个文件是PDF格式的

那么它不是文本文件。这是一个二进制文件,应该将其视为二进制文件。在其上使用StreamReader会丢失数据。您需要使用另一个API来访问其中的数据 - 一个能够理解PDF格式的API。请查看iTextSharpPDFTron


听起来iTextSharp并不适用于Metro风格的应用程序,并且可能依赖于Metro风格应用程序无法使用的.NET框架的某些部分。 实际上,这个文件是文本和二进制文件的组合。难道没有其他修改它的方法吗? - Nicolas Voron
2
@NicolasVoron:如果是PDF文件,那么是由文本内容和二进制混合组成的 - 但你需要了解文件格式才能处理它。如果iTextSharp对你不起作用,可以寻找其他库 - 但放弃使用仅适用于纯文本的StreamReader的想法。 - Jon Skeet
@NicolasVoron:你从来没有说它必须是免费的 :) 听起来有很多约束条件一开始没有明确提出。(例如,很容易忽略标签。如果您知道一个不寻常的要求,在问题中最好声明。)我不会感到惊讶,发现目前没有适用于WinRT的好的PDF库。 - Jon Skeet
你是对的(你可以去掉“好”的部分,意思是一样的)。实际上,由于缺乏pdf库,我试图制作一个模板并自己编辑部分内容(需要更改的东西很少)...最终看起来似乎不是个好主意! - Nicolas Voron
请原谅我提出的问题不够清晰和详尽,我会尽力让下一个问题更加明确和详细。;) - Nicolas Voron
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接