无效的高代理字符(0xDEE1)。高代理字符必须具有范围(0xD800 - 0xDBFF)中的值

时间:2013-04-03 00:22:41

标签: c# linq-to-xml aes

如何修复此错误,我尝试cardnumber仅加密,并且在添加expdate时,我在创建xml文件时没有任何问题。它会提示错误,

到目前为止,这是我的代码:

    cardnumber = cs_aes.Encrypt(cardnumber);
expdate = cs_aes.Encrypt(expdate);

XElement xml_request = new XElement("Request",
                new XElement("Transaction",
                    new XElement("CardNumber", cardnumber),
                    new XElement("CardMember", cardmember),
                    new XElement("ExpDate", expdate),
                    new XElement("Amount", amount),
                    new XElement("Invoice", invoice),
                    new XElement("Zip", zip),
                    new XElement("Street", street),
                    new XElement("Security", security),
                    ));

                    xml_request.Save(path here);

加密/解密代码

2 个答案:

答案 0 :(得分:5)

您的GetString()方法已损坏。你不能将byte []存储在这样的字符串中。字符串中的字节值任意,它们必须遵循规范化的utf-16编码字符串的规则。你可能很幸运,因为它在一个不好的代理价值上窒息,规范化也有随机破坏你的数据的习惯,而你却很容易发现它。

您可以使用Convert.ToBase64String()将byte []转换为字符串。

答案 1 :(得分:2)

正如预期的那样,代码通过将字节数组转换为char数组而不是字符串来将字节序列转换为字符串。

这是个坏主意,因为字节数组可能包含在许多期望有效字符串的上下文中无效/不可接受的序列:

  • 0个字符(两个0字节)可能导致许多API将字符串视为以该字符终止
  • 0-31字符无法打印/不允许使用XML
  • 无效的代理对在尝试在屏幕上打印/显示时无法正确呈现,在XML中也不允许
  • 许多字符与可见表示无关。

处理字节数组/二进制数据的正确方法是按原样存储(如果存储格式允许)或编码(即建议使用XML base64编码)。