Java 尝试将字符串编码/解码为Base64时出错

Java 尝试将字符串编码/解码为Base64时出错,java,base64,Java,Base64,我需要从一个字节数组到另一个字节数组进行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.encod

我需要从一个字节数组到另一个字节数组进行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)
这对我很有用:

        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()
    encode(bytes)
    方法已经返回了一个
    String
    (正如其他调用此方法的人所指出的,这可能是导致错误的原因)
  • 当不需要更多代码(
    Base64.decode(stringToStore.getBytes())
    )时,为什么要转换为字节
    • 你能试试

      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()); 
      
      这并不是把字节变成字符串。它是对象的Java字符串表示(例如,
      )[B@9a4d5c6“
      )。您需要执行iccthedral建议的操作,并向字符串类提供字节。

      Base64.decode()
      似乎是。调用
      toString()
      将为您提供数组的一些默认Java描述,与“56AB0FC3”不同。”.你需要自己进行转换

      同样,您对
      getBytes()
      的调用完全没有按照您的想法执行。

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

      你应该使用

      new String(Base64.encode(bytes))
      
      正如iccthedral所建议的那样。

      我从中尝试了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]
      

      如果您使用的是Android API 8+,
      Android.util
      中有一个
      Base64
      助手类

      String stringToStore =  Base64.encodeToString(cipherText, Base64.DEFAULT);
      

      最初,如果您将其用作密码,则不建议将其转换为字符串

      byte[] bytes = new byte[]{1,2,3,4,5,6,7,8,9}; String stringToStore = new String(Base64.encode(bytes), "UTF-8"); byte[] restoredBytes = Base64.decode(stringToStore.getBytes()); 字节[]字节=新字节[]{1,2,3,4,5,6,7,8,9}; String stringToStore=新字符串(Base64.encode(字节),“UTF-8”); byte[]restoredBytes=Base64.decode(stringToStore.getBytes());
      要解码包含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);
      

      如果对您有效,您应该接受其中一个答案。请提供一个指向Base64类的链接,该类的encode()返回字符串而不是字节[]
      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);