解码XML时base64字符串中的字符无效

问题描述:

我们有一个Winform客户端应用程序,它可以包含我们编写的Web服务。此客户端应用程序请求包含在XML文件中的文档,通常是将PDF写入XML文件中的base64编码二进制字段。解码XML时base64字符串中的字符无效

客户端正确下载,解码并打开99%的文档。

但是,我们已经开始遇到一些是失败文件的客户机进行此调用时:

byte[] buffer = Convert.FromBase64String(xNode["fileIMAGE"].InnerText); 

System.FormatException-

Message="Invalid character in a Base-64 string." 
Source="mscorlib" 

我们从写出来的base64 BLOB将XML文件转换为文本文件。我没有看到任何“\ 0”字符。我可以发布整个blob,但它非常大。

任何想法?

+0

你有可能添加一些代码来报告所有不在'isalnum()','+'或'/'中的字符吗?这应该会留下一大堆新行或新纪元或类似的东西,最后的填充以及你的神秘性格。 – sarnold 2011-05-07 02:03:37

+0

我坐在这里写一个测试应用程序来解析结果字符来测试这件事情。尝试实现这里提供的解决方案http://stackoverflow.com/questions/3355407/validate-string-is-base64-format-using-regex – paparush 2011-05-07 02:09:42

+0

在base64 blob的主体中有=(等号)。我不认为这是一个有效的base64字符(A-Z a-z 0-9 + /),而不是在最后填充。 – paparush 2011-05-07 03:13:56

解决的问题

要流从服务器上的文件,我们使用一个回调函数来读取文件/写入块。我们base64编码每个块。错误。

解决方案 - 将所有块写入全局内存流对象。在回调结束时,然后执行base64编码。

在回调函数:

if (brData.ChunkNo == 1) 
    { 

     // Set the Content-type of the file 
     if (brData.MimeType.Length < 1) 
     { 
      mimeType = "application/unknown"; 
     } 
     else 
     { 
      mimeType = brData.MimeType; 
     } 

     msbase64Out = new MemoryStream(); 
    } 


    if (brData.bytesJustRead > 0) 
    { 
     fileMS.WriteTo(msbase64Out); 

    } 


    if (brData.bytesRemaining < 1) 
    { 
     byte[] imgBytes = msbase64Out.ToArray(); 

     string img64 = Convert.ToBase64String(imgBytes); 

     viewdocWriter.WriteString(img64); 
    } 

msbase64Out是被写入每个回调被调用时到全局内存流。 viewdocWriter是一个全局XML编写器,负责编写发送到客户端应用程序的XML流。