[英]Java Base64 encoded string vs. .NET Base64 encoded string
问题:我有一个.NET HTTP Handler接受XML的HTTP POST,我相信它来自Java系统。 一个元素包含base64字符串编码文档(当前测试文件是PDF)。 当我从原始PDF获取并从.NET生成base64字符串时,它与提供的XML中的相应文本之间存在一些差异。
有很多地方出现以下三种情况之一:
类似地,XML文件插入了一对连续空格,而不是.NET的加号
PgplbmRv YmoKNSAw
vs. PgplbmRv++YmoKNSAw
有时XML文件插入了一对连续的空格而不是.NET的版本,并且在XML版本中附近添加了额外的空格
3kuPs 85QZWYaw BsMNals
vs. 3kuPs 85QZWYaw++BsMNals
源XML将有四个空格(下面显示为2个空格),而.NET则有一对连续的加号
vGDmKEJ gnJeOK
vs. 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());
...
加号可能通过一些URLDecoding转换为空格,其中空格由加号表示。 实际的base64编码结果中不应该有任何空格; 空格是一个无效的字符。 也许简单的搜索和替换可以纠正这一点,但您可能想要确定您的结果是如何被URLDecoded。
有两个问题。
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));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.