在 java 服务器上解码 Base64 编码数据

Decode Base64 encoded data on the java server

处理方法:我将简单的数据编码为base64,然后发送到服务器。同样,我正在尝试解码 Java 服务器上的 base64 编码数据,但总是存在无法正确解码的异常。感谢任何帮助。

客户端代码片段(Android 应用程序):

private String random(int size) {

  Random generator = new Random();
  StringBuilder randomStringBuilder = new StringBuilder();
  //int randomLength = generator.nextInt(size);
  char tempChar;
  for (int i = 0; i < size; i++){
      tempChar = (char) (generator.nextInt(90 - 65) + 65);
      randomStringBuilder.append(tempChar);
  }
  return randomStringBuilder.toString();
}


String data = random(packetSize);
Log.d(data, " Random String");

byte [] encodedBuffer = Base64.encode(data.getBytes("UTF-8"), 0);
DatagramPacket packet =
        new DatagramPacket(encodedBuffer, encodedBuffer.length, address, dstPort);
Log.d(String.valueOf(packetSize), "Sending packet Size");

SocketHandler.getSocket().send(packet);

服务器代码片段:

private String decodeBase64(String encoded) {
  try
  {
    byte[] decodedBytes = Base64.getMimeDecoder().decode(encoded.getBytes("UTF-8"));
    String decodeData = new String(decodedBytes);
    return decodeData;
  }
  catch (Exception e) {
    System.out.println("Unable to decode");
    return null;
  }
}

public void run() {
  try {
    byte[] buf = new byte[1400];
    DatagramPacket packet = packet = new DatagramPacket(buf, buf.length);
    System.out.println("UDP Server waiting");
    while(true)
    {

      try {
        SocketHandler.getSocket().receive(packet);
        System.out.println("Received: " + decodeBase64(new String(packet.getData())));

      }
      catch (SocketException e1) {
        System.out.println("Socket closed " + e1);
      }
    }
  } 
  catch (Exception e) {
    e.printStackTrace();
  }
}

异常:

java.lang.IllegalArgumentException: Input byte array has incorrect ending byte at 147
    at java.util.Base64$Decoder.decode0(Base64.java:742)
    at java.util.Base64$Decoder.decode(Base64.java:526)

示例输入(生成随机字符串):

LVYAGHNVAUUEVNSEQHLHNNHGOHKFJQICSGXMXLJGBICOGJTWGBFLRSROJQWIWCETRXMTDWASGILXCDPRBIYAWFTBRRWN

尝试使用 class javax.xml.bind.DatatypeConverter 进行解码而不是 Base64。对我来说有帮助。 例如替换:

byte[] decodedBytes = Base64.getMimeDecoder().decode(encoded.getBytes("UTF-8"));

byte[] decodedBytes = DatatypeConverter.parseBase64Binary(base64str)

可以试试这个

import java.util.Base64;

public static void main(String[] args)
{
    String input = new String("FMKPARSQQTIENUDYWMRWXKGEEAOHFJBEXMKGWCUFBPICEGYNXEQWQDDOXWOR‌LVGNHNLALVUEWVXLHUKA‌MRHSPONMAMRB");
    System.out.println("input " + input);
    byte[] encodedBytes = Base64.getEncoder().encode(input.getBytes());
    System.out.println("encodedBytes " + new String(encodedBytes));
    byte[] decodedBytes = Base64.getDecoder().decode(encodedBytes);
    System.out.println("output " + new String(decodedBytes));

 }

在线编译执行得到

输入 FMKPARSQQTIENUDYWMRWXKGEEAOHFJBEXMKGWCUFBPICEGYNXEQWQDDOXWORâLVGNHNLALVUEWVXLHUKAâMRHSPONMAMRB

encodedBytes Rk1LUEFSU1FRVElFTlVEWVdNULdYS0dFRUFPSEZKQkVYTUtHV0NVRkJQSUNFR1lOWEVRV1FERE9YV09Sw6LCgMKMTFZHTkhOTEFMVlVFV1ZYTEhVS0HDosKAwoxNUkhTUE9OTUFNUkI=

输出 FMKPARSQQTIENUDYWMRWXKGEEAOHFJBEXMKGWCUFBPICEGYNXEQWQDDOXWORâLVGNHNLALVUEWVXLHUKAâMRHSPONMAMRB