【问题标题】:Base64 difference between C# and JavaC#和Java之间的Base64区别
【发布时间】:2012-01-21 01:04:05
【问题描述】:

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()? 通过使用 Java,我需要与 C# 中相同的结果。

【问题讨论】:

  • 你说image 是一个字符串。但是Convert.ToBase64String 没有string,只有byte[]
  • 你能告诉我们如何将图像数据放入字符串中吗?请用两种语言。
  • 有解释原因的人,解释你的代码错误的原因,否则需要提供C#代码并提供说明。

标签: c# java base64


【解决方案1】:

我也遇到了同样的问题。网上有个说法:

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

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

Convert.ToBase64String(byteArray).

最后发现解决这个问题最好的办法是:

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

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

【讨论】:

    【解决方案2】:

    你是base64编码一个字符串?你想让它做什么?您首先需要将字符串转换为字节序列,选择编码,例如 UTF-8 或 UTF-16。

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

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

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

    【讨论】:

    • 你是对的。它是编码。我将图像文件读入字符串。在我将图像文件读入 ascii 中的字节 [] 后,结果现在相等。谢谢
    【解决方案3】:

    首先,您需要了解一个字节存储 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[]。 ;)

    【讨论】:

      猜你喜欢
      • 2012-02-12
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      相关资源
      最近更新 更多