C#和Java之间的Base64差异

4

image 是图像文件的字符串。

我有以下 C# 代码:

Convert.ToBase64String(image);

和以下 Java 代码:org.apache.commons.codec.binary.Base64.encodeBase64(image.getBytes())

结果不同。

有人说这是因为:

  • Java byte:-128 to 127

  • C# byte:0 to 255

但是我该如何解决呢?如何在 Java 中实现 C# 的 Convert.ToBase64String()? 我需要使用 Java 获得与 C# 相同的结果。


1
你说image是一个字符串。但是Convert.ToBase64String只接受byte[],不接受string - CodesInChaos
1
你能展示一下如何将图像数据转换为字符串吗?请提供两种语言的实现。 - Stephan
请让解释原因的人解释您的代码错误原因,否则您需要提供C#代码并进行澄清。 - Security Hound
3个回答

6

首先你需要意识到一个字节存储256个值,无论它是有符号还是无符号的。如果你想从一个有符号字节中获取无符号值(这是Java支持的),你可以使用& 0xFF

例如:

byte[] bytes = { 0, 127, -128, -1};
for(byte b: bytes) {
  int unsigned = b & 0xFF;
  System.out.println(unsigned);
}

打印

0
127
128
255

简单的回答是你不需要一个具有相同值的byte[]。;)

4
你正在对一个字符串进行base64编码?你想要做什么?你首先需要将字符串转换为字节序列,选择一种编码方式,如UTF-8或UTF-16。
我猜你在双方使用了不同的编码方式。Java的String.GetBytes()使用默认字符集(可能是类似于西方Windows版本的Latin1)。对于C#,你没有发布相关代码。
为了解决这个问题,选择一种编码方式并在两边明确地使用它。我建议使用UTF-8。 在Java端,你应该使用正确的方法进行编码,以避免最终出现“修改后的UTF-8”,但因为我不是Java程序员,所以我不知道哪些方法会输出修改后的UTF-8。我认为只有在滥用一些内部序列化方法时才会发生这种情况。
有符号与无符号字节在这里不应该相关。中间的字节缓冲区将不同,但原始字符串和base64字符串在两端应该是相同的。

你是正确的。这是编码问题。我将图像文件读入字符串,然后将其转换为ASCII格式的字节数组,结果现在相等了。谢谢。 - zhouxiang

0

我也遇到了同样的问题。在互联网上有一句话:

Java byte : -128 to 127 | C# byte : 0 to 255

我查阅了Java Base64编码和解码的算法原理。使用C#实现Base64算法并运行程序:结果与原文相同。
Convert.ToBase64String(byteArray).

最终发现解决这个问题的最佳方法是:

Uri.EscapeDataString(Convert.ToBase64String(byteArray)).

需要注意的是,这就是URL中特殊字符的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接