【问题标题】:Convert base64 to text将base64转换为文本
【发布时间】:2019-05-06 00:16:35
【问题描述】:

我正在开发接收编码为 base64 的消息的应用程序。 可以接收所有语言的消息,也可以只包含数字。我需要将 base64 转换为可读文本。 获取文本。 我在用 apache.commons.codec.binary.Base64 和 apache.commons.codec.binary.Hex

我有两个问题:

  1. 当我试图解析收到的英文或数字消息时 我无法正确解析 base 64。
  2. 如何区分 base64 消息(由 4 位十六进制数字(如俄语或希伯来语)表示)与英语消息或数字(由 2 位十六进制数字或英语表示)。

这是我的代码:

private String convertBase64StringToText(String base64) {
    base64 = "MdmMBg==";//base64.replace("\n", "").replace("\r", "");
    byte[] decoded = Base64.decodeBase64(base64);
    String basetohex = Hex.encodeHexString(decoded);
    char ch[] = basetohex.toCharArray();
    String output = new String(ch);
    output = output.toUpperCase();
    StringBuilder str = new StringBuilder();
    for(int i=0;i<ch.length;i=i+2){

        str.append((char) Integer.parseInt(output.substring(i, i + 2), 16));
        //for languages like russian or hebrew i'm changing from 
         //output.substring(i, i + 2) to output.substring(i, i + 4) and it 
          //works fine

    }

    System.out.println("str.toString():"+str.toString());//received: 1Ù instead of 1234
    return str.toString();
}

【问题讨论】:

    标签: java internationalization base64 hex


    【解决方案1】:

    以下四种实用方法可帮助您进行编码和解码 Base64。请尝试一下,我认为您的问题会解决,因为这些方法使用 UTF-8 作为其字符集:

    public static String encodeBase64(String plainText) {
        byte[] plainTextByteArray = plainText.getBytes(StandardCharsets.UTF_8);
        String base64Encoded = Base64.getEncoder().encodeToString(plainTextByteArray);
        return base64Encoded;
    }
    
    public static String decodeBase64(String base64File) {
        byte[] byteArray = Base64.getDecoder().decode(base64File);
        String decodedStr = new String(byteArray, StandardCharsets.UTF_8);
        return decodedStr;
    }
    
    public static String encodeBase64(byte[] fileByteArray) {
        String base64Encoded = Base64.getEncoder().encodeToString(fileByteArray);
        return base64Encoded;
    }
    
    public static byte[] decodeBase64ToByteArray(String base64File) {
        byte[] byteArray = Base64.getDecoder().decode(base64File);
        return byteArray;
    }
    

    【讨论】:

    • 我试过这个:` byte[] byteArray = Base64.getDecoder().decode("MdmMBg=="); String decodedStr = new String(byteArray, StandardCharsets.UTF_8); System.out.println("decodedStr:"+decodedStr);`但是又收到了:1ٌ
    • @HaimKlainman 当然是因为在解码之前必须先对字符串进行编码。解码仅在您对其进行编码后才起作用,而不仅仅是对普通字符串进行解码!!!!试试这个: String plainText = "MdmMBg=="; byte[] plainTextByteArray = plainText.getBytes(StandardCharsets.UTF_8);字符串 base64Encoded = java.util.Base64.getEncoder().encodeToString(plainTextByteArray); byte[] byteArray = Base64.decode(base64Encoded); String decodedStr = new String(byteArray, StandardCharsets.UTF_8); System.out.println("decodedStr:"+decodedStr);
    • Mehdi 我不明白你的例子,很抱歉,但你的最后一个例子返回了相同的 base64 字符串:decodedStr:MdmMBg==
    • @HaimKlainman 解码一个值,你应该先编码。在您之前的评论中,您解码了一个字符串而不对其进行编码。这是错误的,因此它不起作用
    • 如果我理解正确,那么即使我收到了已经编码为 base64 的 base64 字符串,我只想将其解码为可读字符串,然后我应该先再次对其进行编码,然后再解码正如你在第一个答案中所展示的那样?
    【解决方案2】:

    base64 编码将应用于您收到的数据的二进制形式。

    一旦你有了二进制形式,你就需要使用字符编码,例如UTF-8(但取决于最初使用的内容)将二进制数据转换为 Unicode 字符串。

    一旦你有了一个 Unicode 字符串,它将能够支持 Unicode 集中的所有字符。您不必担心它们是俄语、希伯来语还是任何其他类型的字符。

    【讨论】:

      猜你喜欢
      • 2014-09-14
      • 1970-01-01
      • 2015-04-29
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      相关资源
      最近更新 更多