image
是图像文件的字符串。
我在C#中有如下代码:
Convert.ToBase64String(image);
和代码如下:
org.apache.commons.codec.binary.Base64.encodeBase64(image.getBytes())
结果不同。
有人说是因为
Java字节:-128到127
C#字节:0到255
但我该如何解决这个问题呢?如何在Java中实现C#的Convert.ToBase64String()
?
我需要使用与C#相同的结果。
答案 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中特殊字符的原因。