Base64 C#和Java之间的区别

时间:2011-12-15 10:09:40

标签: c# java base64

image是图像文件的字符串。

我在C#中有如下代码:

Convert.ToBase64String(image);

Java中的

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

结果不同。

有人说是因为

  • Java字节:-128到127

  • C#字节:0到255

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

3 个答案:

答案 0 :(得分:6)

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

e.g。

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

打印

0
127
128
255

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

答案 1 :(得分:4)

你是base64编码字符串?你想要那样做什么?首先需要将字符串转换为字节序列,选择UTF-8或UTF-16等编码。

我的猜测是你设法在双方使用不同的编码。 Java的String.GetBytes()使用默认的字符集(在西方Windows版本上可能类似于Latin1)。对于C#,您没有发布相关代码。

要解决此问题,请选择编码并在两侧明确使用。我建议使用UTF-8 在Java方面你应该使用正确的编码方法,所以你最终不会得到“修改过的UTF-8”,但由于我不是java程序员,我不知道哪个方法输出修改了UTF-8 。我认为只有滥用某些内部序列化方法才会发生这种情况。

有符号与无符号字节在这里不相关。中间字节缓冲区将有所不同,但原始字符串和base64字符串在两端应该相同。

答案 2 :(得分:0)

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

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

我查看了Java base64编码和解码的算法原理。使用C#实现base64算法并运行程序:结果与

相同
Convert.ToBase64String(byteArray).

最后发现解决此问题的最佳方法是:

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

应注意,这是URL中特殊字符的原因。