处理从Flash的ExternalInterface接收的\ x01

时间:2012-09-06 13:59:07

标签: c# flash byte

我正在从嵌入在Windows窗体中的Flash组件接收数据。不幸的是,如果从套接字返回的数据包含以下任何字符,则下面对loadXml的调用将失败:

这是我必须从套接字接收数据的回调方法(通过Flash组件中的ExternalInterface)。

private void player_FlashCall(object sender, _IShockwaveFlashEvents_FlashCallEvent e)
{
            String output = e.request;
            //output = CleanInvalidXmlChars(output);
            XmlDocument document = new XmlDocument();
            document.LoadXml(output);

            XmlAttributeCollection attributes = document.FirstChild.Attributes;
            String command = attributes.Item(0).InnerText;              
            XmlNodeList list = document.GetElementsByTagName("arguments");               
            process(list[0].InnerText);

我有一个用文本替换字符的方法(CleanInvalidXmlChars),但我不认为这是正确的方法。

如何将此数据加载到XML文件中,因为这样可以将返回的方法名称,参数名称和参数类型分开,非常容易使用。

非常感谢任何帮助。

感谢。

1 个答案:

答案 0 :(得分:0)

如果“XML”包含任何U + 0001(又名'\ x01')或其他类似字符,则不是有效的XML 。你无法在XML中包含这些字符(无论如何,在XML 1.0中)。见the XML specification。如果您需要通过,例如XML中的二进制数据,您需要将它们转换为适当的形式,例如使用Base-64。

如果数据确实包含那些无效字符,则它不是XML,因此无法使用标准XML工具读取(我不认为任何标准.NET类允许您覆盖该行为)。您可以替换所有这些字符(这些基本上都是所有控制字符(U + 0000到U + 001F),除了U + 0009(标签),U + 000A和U + 000D(CR + LF),再加上U + FFFE和U + FFFF(非字符))在您尝试使用之前 - 您可以设计一个不会丢失任何数据的安全转换(例如,首先用@ 0040替换所有@字符,然后用@xxxx替换任何无效字符,其中xxxx是其代码,并且在处理解析的XML数据时,将所有@xxxx替换回来。)

另一种选择是删除XML思想并将其作为字符串处理。仅供参考,请参阅例如this piece of code