1

问题: 我有一个 .NET HTTP 处理程序接受 XML 的 HTTP POST,我相信它来自 Java 系统。一个元素包含一个 base64 字符串编码的文档(当前测试文件是 PDF)。当我获取原始 PDF 并从 .NET 生成 base64 字符串时,它与提供的 XML 中的相应文本之间存在一些差异。

有许多地方会发生以下三种情况之一:

  1. XML 文件在 .NET 放置加号的地方放置一个空格
  2. 同样,XML 文件插入了一对连续的空格,而 .NET 的优点

    PgplbmRv YmoKNSAw 对比 PgplbmRv++YmoKNSAw

  3. 有时 XML 文件插入了一对连续的空格,而 .NET 的优点在 XML 版本附近添加了额外的空格

    3kuPs 85QZWYaw BsMNals 对比 3kuPs 85QZWYaw++BsMNals

  4. 源 XML 将有四个空格(下面的显示看起来像 2 个空格)而 .NET 有一对连续的加号

    vGDmKEJ gnJeOK 对比 vGDmKEJ++gnJeOK

此外,源数据(Java 创建的?)数据中没有任何优点。

问题: 有人可以帮助确定可能导致这些差异的原因吗?最紧迫的是我如何解决它们,因为我看不到用于搜索和替换的可靠模式?

编辑: 当 POST 到达时,它会在反序列化为对象之前进行 URL 解码。

public void ProcessRequest(HttpContext context)
{
    try
    {
        StreamReader reader = new StreamReader(context.Request.InputStream);
        context.Response.ContentType = "text/plain";
        var decodedRequest = HttpUtility.UrlDecode(reader.ReadToEnd());
        ...
4

2 回答 2

3

加号很可能通过一些 URLDecoding 转换为空格,其中空格由加号表示。实际的 base64 编码结果中不应有任何空格;空格是无效字符。也许一个简单的搜索和替换可以纠正这个问题,但您可能想确定您的结果是如何被 URLDecoded 的。

于 2013-05-13T17:11:08.190 回答
1

有两个问题。

  1. URL 解码将现有的优点翻译成空格。
  2. POSTing Java 代码强制采用 MIME 标准的 76 字符行长度。

URL 解码还将行尾的 CRLF 转换为双空格。CRLF 还会导致文档长度膨胀,导致需要重新考虑填充等号。以下代码去除填充(稍后重新计算和附加),将空格返回到加号并删除那些是 CRLF 占位符的。

// convert spaces to pluses and trim base64 spacers
char[] charDoc = doc.CONTENT.Replace(' ', '+').TrimEnd(new char[] {'='}).ToCharArray();

StringBuilder docBuilder = new StringBuilder();
for (int index = 0; index < charDoc.Length; index++)
{
    if ((index % 78 == 76) && (index < charDoc.Length - 1) && charDoc[index]  == '+' && charDoc[index + 1] == '+' )
    {
        index++;
        continue;
    }
    docBuilder.Append(charDoc[index]);
}
// Add padding, if needed--replicates 0-2 equals
docBuilder.Append(new string('=', (4 - docBuilder.Length % 4)%4));
于 2013-05-14T16:08:54.220 回答