首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >十六进制值0x00是无效字符。

十六进制值0x00是无效字符。
EN

Stack Overflow用户
提问于 2012-06-14 15:50:27
回答 7查看 147.2K关注 0票数 39

我正在从StringBuilder生成一个XML文档,基本上如下所示:

代码语言:javascript
复制
string.Format("<text><row>{0}</row><col>{1}</col><textHeight>{2}</textHeight><textWidth>{3}</textWidth><data>{4}</data><rotation>{5}</rotation></text>

稍后,类似于:

代码语言:javascript
复制
XmlDocument document = new XmlDocument();
document.LoadXml(xml);
XmlNodeList labelSetNodes = document.GetElementsByTagName("labels");
for (int index = 0; index < labelSetNodes.Count; index++)
{
    //do something
}

所有的数据都来自一个数据库。最近,我对这个错误有几个问题:

十六进制值0x00是无效字符,第1行,位置nnnnn。

但这不一致。有时,一些“空白”数据会起作用。这些“错误”的数据可以在一些个人电脑上工作,但在其他电脑上就不行了。

在数据库中,数据始终是一个空字符串。它从来不是'null‘,在XML文件中,它以< data>< /data>的形式出现,也就是说,在开始和结束之间没有字符。(但不确定这是否可以依赖,因为我是从“立即”窗口是vis工作室,并将其粘贴到textpad)。

server的版本(2008年可能会失败,2005年也会工作)和排序也可能存在差异。不确定这些可能的原因是什么?

但完全相同的代码和数据有时会失败。知道问题在哪里吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-06-14 18:27:00

如果没有您的实际数据或源,我们将很难诊断出哪里出了问题。不过,我可以提出一些建议:

在XML的所有版本中,

  • Unicode NUL (0x00)都是非法的,验证解析器必须拒绝包含它的输入。尽管存在上述问题,但
  • 仍然存在;没有验证的XML可以包含任何类型的垃圾格式错误的字节,
  • 1.1允许零宽度和非打印控制字符(NUL除外),因此您不能在文本编辑器中查看XML 1.1文件并判断其中包含什么字符。

考虑到您所写的内容,我怀疑将数据库数据转换为XML的任何内容都被破坏了;它正在传播非XML字符。

使用非XML字符(NULs、DEL、控制字符等)创建一些数据库条目。并在上面运行XML转换器。将XML输出到文件中,并在十六进制编辑器中查看它。如果其中包含非XML字符,则转换器将中断。修复它,或者,如果不能的话,创建一个预处理程序,它拒绝使用这样的字符输出。

如果转换器输出看起来很好,那么问题就在XML使用者中;它是在某个地方插入非XML字符。您将不得不将您的消费过程分解为不同的步骤,检查每个步骤的输出,并缩小引入不良字符的范围。

检查文件编码(用于UTF-16)

更新:我自己刚碰到了一个例子!所发生的事情是,生产者将XML编码为UTF16,而使用者则期望UTF8。由于UTF16使用0x00作为所有ASCII字符的高字节,而UTF8不使用,因此使用者将每秒钟的字节视为NUL。在我的例子中,我可以更改编码,但是建议所有的XML有效负载都从BOM开始。

票数 36
EN

Stack Overflow用户

发布于 2013-10-24 17:24:28

在我的例子中,它花了一些时间挖掘,但找到了。

我的上下文

我正在使用Elmah查看网站上的异常/错误日志。Elmah以大型XML文档的形式返回异常时服务器的状态。对于我们的报告引擎,我用XmlWriter很好地打印了XML。

在网站攻击期间,我注意到一些xml没有解析,并收到了这个'.', hexadecimal value 0x00, is an invalid character.异常。

NON-RESOLUTION: --我将文档转换为byte[],并将其消毒为0x00,但没有发现任何文档。

当我扫描xml文档时,发现了以下内容:

代码语言:javascript
复制
...
<form>
...
<item name="SomeField">
   <value
     string="C:\boot.ini&#x0;.htm" />
 </item>
...

有一个nul字节被编码为html实体&#x0;

解析:为了修复编码,我在将&#x0;值加载到之前替换了它,因为加载它将创建nul字节,并且很难从对象中净化它。以下是我的整个过程:

代码语言:javascript
复制
XmlDocument xml = new XmlDocument();
details.Xml = details.Xml.Replace("&#x0;", "[0x00]");  // in my case I want to see it, otherwise just replace with ""
xml.LoadXml(details.Xml);

string formattedXml = null;

// I have this in a helper function, but for this example I have put it in-line
StringBuilder sb = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings {
    OmitXmlDeclaration = true,
    Indent = true,
    IndentChars = "\t",
    NewLineHandling = NewLineHandling.None,
};
using (XmlWriter writer = XmlWriter.Create(sb, settings)) {
    xml.Save(writer);
    formattedXml = sb.ToString();
}

经验教训:如果输入的数据是在条目上编码的,则使用关联的html实体对非法字节进行清理。

票数 17
EN

Stack Overflow用户

发布于 2015-07-17 16:26:27

为了补充Sonz上面的答案,下面的回答对我们很有用。

代码语言:javascript
复制
//Instead of 
XmlString.Replace("&#x0;", "[0x00]");
// use this
XmlString.Replace("\x00", "[0x00]");
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11036799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档