16

我需要从字节数组到stirng进行Base64编码,而不是另一个字节数组。但是当我将它解码回来时,我得到了异常。这是代码

我正在尝试使用 Base64 编码将字节数组编码为字符串。当我编码时,它似乎可以工作,但是当我解码时,它会引发异常。我究竟做错了什么?

import org.springframework.security.crypto.codec.Base64;

byte[] bytes = new byte[]{1,2,3,4,5,6,7,8,9};
String stringToStore = Base64.encode(bytes).toString();
byte[] restoredBytes = Base64.decode(stringToStore.getBytes());

这是我得到的例外:

org.springframework.security.crypto.codec.InvalidBase64CharacterException: Bad Base64 input character decimal 91 in array position 0
at org.springframework.security.crypto.codec.Base64.decode(Base64.java:625)
at org.springframework.security.crypto.codec.Base64.decode(Base64.java:246)
4

9 回答 9

17

能不能试试...

byte[] bytes = new byte[]{1,2,3,4,5,6,7,8,9}; 
String stringToStore = new String(Base64.encode(bytes));
byte[] restoredBytes = Base64.decode(stringToStore.getBytes()); 
于 2012-09-06T12:57:43.390 回答
7

Base64.encode(bytes).toString()不返回您期望的字符串。

你应该使用

new String(Base64.encode(bytes))

正如 iccthedral 所建议的那样。

于 2012-09-06T13:12:28.150 回答
3
String stringToStore = Base64.encode(bytes).toString();

这不是将字节转换为字符串。它是对象的 Java 字符串表示形式(例如,"[B@9a4d5c6")。您需要执行 iccthedral 的建议并将字节提供给 String 类。

于 2012-09-06T12:59:17.687 回答
2

If you are using Android API 8+ there's a Base64 helper class in android.util.

String stringToStore =  Base64.encodeToString(cipherText, Base64.DEFAULT);
于 2014-09-23T16:00:02.463 回答
1

最初,如果您将其用于密码,则不建议将其转换为字符串。要用作字符串,请遵循以下代码段

    字节[]字节=新字节[]{1,2,3,4,5,6,7,8,9};
    String stringToStore = new String(Base64.encode(bytes), "UTF-8");
    byte[] restoreBytes = Base64.decode(stringToStore.getBytes());

于 2014-11-25T08:50:46.263 回答
1

这对我有用:

        byte[] bytes = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9};
        String stringToStore = Base64.encode(bytes);
        //System.out.println(stringToStore);//AQIDBAUGBwgJ
        byte[] restoredBytes = Base64.decode(stringToStore);
        //System.out.println(Arrays.toString(restoredBytes));//[1, 2, 3, 4, 5, 6, 7, 8, 9]

我对其进行了一些编辑:

  • 不要调用toString(). 方法已经返回一个(正如其他人所说的那样,这可能是导致错误的原因)Stringencode(bytes)String
  • 为什么在不需要更多代码时转换为字节(Base64.decode(stringToStore.getBytes())
于 2012-09-06T12:55:56.467 回答
0

要解码包含 base64 内容的字节数组,您可以使用javax.xml.bind.DatatypeConverter。它工作得很好。我用它来解码二进制类型的 MongoDB 值。

String testString = "hi, I'm test string";
byte[] byteArrayBase64 = org.apache.commons.codec.digest.DigestUtils.md5(testString);
String decoded = javax.xml.bind.DatatypeConverter.printBase64Binary(byteArrayBase64);
assert testString.equals(decoded);
于 2015-03-13T14:19:46.107 回答
0

Base64.decode()似乎返回一个byte\[\]. 调用toString()为您提供了数组的一些默认 Java 描述,不像“56AB0FC3...”。您需要自己进行转换。

同样,您的电话getBytes()根本不是您想的那样。

于 2012-09-06T13:01:59.570 回答
0

我从apache codec尝试了 Base64 ,结果很好。

    import org.apache.commons.codec.binary.Base64;
    byte[] bytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    Base64 base64 = new Base64();
    byte[] stringToStore = base64.encode(bytes);
    System.out.print(Arrays.toString(stringToStore));//[65, 81, 73, 68, 66, 65, 85, 71, 66, 119, 103, 74]
    byte[] restoredBytes = base64.decode(stringToStore);
    System.out.print(Arrays.toString(restoredBytes));//[1, 2, 3, 4, 5, 6, 7, 8, 9]
于 2012-09-06T13:14:50.883 回答