【问题标题】:Invalid Character in base64 string when decoding XML解码 XML 时 base64 字符串中的无效字符
【发布时间】:2011-05-07 01:49:30
【问题描述】:

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

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

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

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

System.FormatException-

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

我们已将 XML 文件中的 base64 blob 写入文本文件。我没有看到任何“\0”字符。我可以发布整个 blob,但它非常大。

有什么想法吗?

【问题讨论】:

  • 您是否可以添加一些代码来报告所有不在isalnum()+/ 中的字符?这应该会留下一大堆换行符或 crlf 或类似的东西,最后填充,以及你的神秘角色。
  • 我坐在这里编写一个测试应用程序来解析生成的字符来测试那个东西。尝试实施此处提供的解决方案stackoverflow.com/questions/3355407/…
  • base64 blob 的主体中有 =(等号)。我不认为这是一个有效的 base64 字符(A-Z a-z 0-9 + /),而不是最后的填充。
  • @paparush, hrm,中间那个= 听起来很麻烦。您可以在 small 输入上尝试您的编码例程吗?生成 10 字节到 10 KB 之间的随机字节字符串,也许您会偶然生成一个显示问题的字符串。
  • blob 是否有可能是多个 Base64 对象,每个对象都以 = 填充结尾?

标签: c# asp.net xml base64


【解决方案1】:

问题已解决

为了从服务器流式传输文件,我们使用回调函数来读取/写入文件块。我们对每个块进行 base64 编码。错了。

Resolution- 将所有块写入全局内存流对象。在回调结束时,进行 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 流。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多