Base64 Java кодирует и декодирует строку

Я хочу кодировать строку в base64 и передавать ее через сокет и декодировать его обратно. Но после декодирования он дает другой ответ. Ниже приведен мой код и результат: "77 + 9x6s ="

import javax.xml.bind.DatatypeConverter;

    public class f{

       public static void main(String a[]){

          String str = new String(DatatypeConverter.parseBase64Binary("user:123"));
          String res = DatatypeConverter.printBase64Binary(str.getBytes());
          System.out.println(res);
       }
    }

Любая идея о том, как это реализовать?

Спасибо...

Ответ 1

Вы можете использовать следующий подход,

// encode data on your side using BASE64
byte[]   bytesEncoded = Base64.encodeBase64(str .getBytes());
System.out.println("ecncoded value is " + new String(bytesEncoded ));

// Decode data on other side, by processing encoded data
byte[] valueDecoded= Base64.decodeBase64(bytesEncoded );
System.out.println("Decoded value is " + new String(valueDecoded));

Надеюсь, это ответит на ваши сомнения.

Ответ 2

Java 8 теперь поддерживает кодирование и декодирование BASE64. Вы можете использовать следующие классы: java.util.Base64, java.util.Base64.Encoder и java.util.Base64.Decoder.

Пример использования:

// encode with padding
String encoded = Base64.getEncoder().encodeToString(someByteArray);

// encode without padding
String encoded = Base64.getEncoder().withoutPadding().encodeToString(someByteArray);

// decode a String
byte [] barr = Base64.getDecoder().decode(encoded); 

Ответ 3

В принятом ответе используется пакет Apache Commons, но так я использовал его с помощью javax.xml.bind.DatatypeConverter - это работает, по крайней мере, с Java 6:

import java.io.UnsupportedEncodingException;    
import javax.xml.bind.DatatypeConverter;

public class EncodeString64 {

    public static void main(String[] args) throws UnsupportedEncodingException {

        String str = "77+9x6s=";
        // encode data using BASE64
        String encoded = DatatypeConverter.printBase64Binary(str.getBytes());
        System.out.println("encoded value is \t" + encoded);

        // Decode data 
        String decoded = new String(DatatypeConverter.parseBase64Binary(encoded));
        System.out.println("decoded value is \t" + decoded);

        System.out.println("original value is \t" + str);

    }

}

Лучший способ - попробовать/поймать шаги кодирования/декодирования, но, надеюсь, вы получите эту идею.

Ответ 4

Для Spring пользователей Spring Безопасность имеет класс Base64 в пакете org.springframework.security.crypto.codec, который также может использоваться для кодирования и декодирования Base64. Пример.

 public static String base64Encode(String token) {
    byte[] encodedBytes = Base64.encode(token.getBytes());
    return new String(encodedBytes, Charset.forName("UTF-8"));
}


public static String base64Decode(String token) {
    byte[] decodedBytes = Base64.decode(token.getBytes());
    return new String(decodedBytes, Charset.forName("UTF-8"));
}

Ответ 5

Следующее - хорошее решение -

import android.util.Base64;

String converted = Base64.encodeToString(toConvert.toString().getBytes(), Base64.DEFAULT);

String stringFromBase = new String(Base64.decode(converted, Base64.DEFAULT));

Что это. Однострочное кодирование и декодирование.

Ответ 6

import javax.xml.bind.DatatypeConverter;

public class f{

   public static void main(String a[]){

      String str = new String(DatatypeConverter.printBase64Binary(new String("user:123").getBytes()));
      String res = DatatypeConverter.parseBase64Binary(str);
      System.out.println(res);
   }
}