2

请帮助我将十六进制字符串转换为 base64

这是我得到例外的地方

 String hexString = "bf940165bcc3bca12321a5cc4c753220129337b48ad129d880f718d147a2cd1bfa79de92239ef1bc06c2f05886b0cd5d";

private static String ConvertHexStringToBase64(String hexString) {
    System.out.println(hexString);
    if ((hexString.length()) % 2 > 0)
        throw new NumberFormatException("Input string was not in a correct format.");
     byte[] buffer = new byte[hexString.length() / 2];
        int i = 0;
        while (i < hexString.length())
        {
            buffer[i / 2] = Byte.parseByte(hexString.substring(i, 2));
            i += 2;
        }
        System.out.println("hexSring"+hexString+"afterconverttobase64"+Base64.encodeBase64String(buffer));
        return Base64.encodeBase64String(buffer);

}

我在这里遇到一个例外::bf940165bcc3bca12321a5cc4c753220129337b48ad129d880f718d147a2cd1bfa79de92239ef1bc06c2f05886b0cd5d Exception in thread "main" java.lang.NumberFormatException: For input string: "bf" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:449) at java.lang.Byte.parseByte(Byte.java:151) at java.lang.Byte.parseByte(Byte.java:108) at com.motorola.gst.DecryptTest3.ConvertHexStringToBase64(DecryptTest3.java:38) at com.motorola.gst.DecryptTest3.main(DecryptTest3.java:16)

4

2 回答 2

4

首先,您必须在parseByte方法中指定指定基数(在您的情况下为 16)以避免 numberFormat 异常:

 buffer[i / 2] = Byte.parseByte(hexString.substring(i, 2),16);

但是,您的代码似乎已损坏,请查看更正后的代码:

     if ((hexString.length()) % 2 > 0)
          throw new NumberFormatException("Input string was not in a correct format.");
       int[] buffer = new int[hexString.length() / 2];
          int i = 2;
          while (i < hexString.length())
          {
              buffer[i / 2] = Integer.parseInt(hexString.substring(i, i + 2),16);
              i += 2;
          }

你的循环是错误的,你必须解析为整数,因为你的输入字符串中有一些值溢出了字节能力......

如果您需要字节,您可以通过这种方式将解析的 int 转换为字节:

       byte[] buffer = new byte[hexString.length() / 2];
          int i = 2;
          while (i < hexString.length())
          {
              buffer[i / 2] = (byte)Integer.parseInt(hexString.substring(i, i + 2),16);
              i += 2;
          }
于 2012-10-13T06:57:21.640 回答
-1

找到了一个类似的解决方案,认为分享一下可能会很好:

    public static string convertHexToBase64String(String hexString)
    {
        string base64 = "";

        //--Important: remove "0x" groups from hexidecimal string--
        hexString = hexString.Replace("0x", "");

        byte[] buffer = new byte[hexString.Length / 2];

        for (int i = 0; i < hexString.Length; i++)
        {
            try
            {
                buffer[i / 2] = Convert.ToByte(Convert.ToInt32(hexString.Substring(i, 2), 16));
            }
            catch (Exception ex) { }
            i += 1;
        }

        base64 = Convert.ToBase64String(buffer);

        return base64;
    }

希望它可以帮助别人。

于 2013-12-05T16:23:51.517 回答