【问题标题】:Stream, string and null character流、字符串和空字符
【发布时间】:2013-08-07 16:03:56
【问题描述】:

我有一个包含多个\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

【问题讨论】:

  • 不,ReadToEnd 不使用 \0 作为“流结束”字符。不过,您的诊断可能会被搞砸。尝试打印长度。这些数据是从哪里来的,它应该真的包含这些字符吗?有没有可能你只是使用了错误的编码?
  • 我承认我真的不知道这些字符是否存在。我只是怀疑它。事实是,ReadToEnd() 没有给我完整的文件文本。此文件为包含stream ... endstream 部分的 pdf
  • 啊,对。希望你一开始就这么说。看我的回答。
  • @NicolasVoron:你打算用 PDF 做什么?显示给用户?提取文本?
  • @Brian 我尝试阅读的 pdf 是一个排序模板。我想修改其中的一些标签。没有显示或文本提取,只需替换记事本上可见的一些已知标签值(参见我的编辑)。

标签: c# string stream windows-runtime


【解决方案1】:

啊,现在我们开始了......

此文件为 pdf

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

【讨论】:

  • 听起来 iTextSharp 不是为与 Metro 风格应用程序一起使用而设计的,并且可能依赖于 Metro 风格应用程序不可用的部分 .Net 框架。事实上,这个文件是文本和二进制文件的组合。有没有办法用其他方式修改它?
  • @NicolasVoron:如果是 PDF,那么是的,它是文本内容和二进制文件的混合体——但您需要了解文件格式才能使用它。如果 iTextSharp 不适合您,请查看可以使用的库 - 但放弃任何仅使用 StreamReader 的想法,它是为 just 纯文本设计的。
  • @NicolasVoron:刚刚添加了 PDFTron 的链接,可能更合适。
  • 谢谢乔恩。 PDFTron 不是免费的,但我会搜索另一个。
  • @NicolasVoron:你从来没有说过它必须是免费的 :) 听起来有很多限制并没有明确提及。 (例如,很容易遗漏标签。如果您知道一个不寻常的要求,最好在问题中说明这一点。)我不会惊讶地发现没有可用于 WinRT 的好的 PDF 库时刻。
【解决方案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 。我会编辑我的帖子。
猜你喜欢
  • 2014-05-05
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
相关资源
最近更新 更多