2011-12-15 292 views
3

image是一个图像文件的字符串。C#和Java之间的Base64差异

我有一些代码在C#如下:

Convert.ToBase64String(image);

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

的结果是不同的。

有人说,它是因为

  • Java字节:-128〜127

  • C#字节:0至255

但我怎么能解决这个问题?我如何在Java中实现C#的Convert.ToBase64String()? 我需要通过使用Java在C#中获得相同的结果。

+1

你在说'图像'是一个字符串。但`Convert.ToBase64String`不接受'字符串',只接受'byte []`。 – CodesInChaos 2011-12-15 10:24:53

+1

你能说明你如何将图像数据导入字符串吗?请用这两种语言。 – Stephan 2011-12-15 10:33:04

回答

3

你的base64编码字符串?你想要做什么?您首先需要将字符串转换为一系列字节,然后选择一种编码,如UTF-8或UTF-16。

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

为了解决这个问题,选择一个编码,并明确地使用它的两侧。我建议使用UTF-8
在Java端,你应该用正确的方法进行编码,这样你就不会用“修订的UTF-8”结束了,但因为我不是一个Java程序员,我不知道是哪个方法输出修改UTF -8。我想认为它只会发生,如果你滥用一些内部的序列化方法。

签名与无符号字节在这里不应该相关。中间字节缓冲区将不同,但原始字符串和base64字符串应该在两边都是相同的。

5

首先,你需要认识到,一个字节存储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 []。 ;)