1

在此示例中(使用 EWS for Exchange 2010 获取组织者的日历约会)我可以从 UID 获取 ID 字符串。但问题是我用 Android 编写的,而不是 C#。所以我需要相同的方法将字符串转换为十六进制数组和 Java 中的 base 64 字符串。我怎么才能得到它?

  private static string GetObjectIdStringFromUid( string id )
  {
      var buffer = new byte[ id.Length / 2 ];
      for ( int i = 0; i < id.Length / 2; i++ )
      {
        var hexValue = byte.Parse( id.Substring( i * 2, 2 ), System.Globalization.NumberStyles.AllowHexSpecifier );
        buffer[ i ] = hexValue;
      }
      return Convert.ToBase64String( buffer );
  }

示例输入:

00000000F1985146856BD941BA2343776A64673F0700855A223A9715B6468B4D00795E77CAAB00000033E03A0000855A223A9715B6468B4D00795E760CAAB000000040

输出:

AAAAPGYUUaFa9lBuiNDd2pkZz8HAIVaIjqXFbZGi00AeV53yqsAAAAz4DoAAIVaIjqXFbZGi00AeV53yqsAAAA0hgsAAA==

4

2 回答 2

1

如果我理解正确,您正在寻找一种将十六进制字符串转换为 Java 中的 Base64 字符串的方法。

可以使用Apache Commons Codec库轻松完成:

String output = new String(Base64.encodeBase64(Hex.decodeHex(input.toCharArray())));
于 2012-04-16T10:47:54.647 回答
1

在没有使用 Java 中的外部 Lib 的情况下,我使用了页面的源代码并将其转换为 java 下面是我的代码

public static String decodeHexToBase64(String hexString){
    if(hexString.length() %2 !=0){
        return null;
    }else{
    int[] binary = new int[hexString.length()/2];
      for (int i=0; i<hexString.length()/2; i++) {
        String h = hexString.substring(i*2, (i*2)+2);
        binary[i] = Integer.parseInt(h,16);        
      }

    return convertToBase64(binary);
    }
}


public static String convertToBase64(int[] input){
    String base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    String ret = "";
      int i = 0;
      int j = 0;
      int[] char_array_3 = new int[3];
      int[] char_array_4 = new int[4];
      int in_len = input.length;
      int pos = 0;

      while (in_len-- > 0)
      {
          char_array_3[i++] = input[pos++];
          if (i == 3)
          {
              char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
              char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
              char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
              char_array_4[3] = char_array_3[2] & 0x3f;

              for (i = 0; (i <4) ; i++)
                  ret += base64_chars.charAt(char_array_4[i]);
              i = 0;
          }
      }

      if (i > 0)
      {
          for (j = i; j < 3; j++)
              char_array_3[j] = 0;

          char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
          char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
          char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
          char_array_4[3] = char_array_3[2] & 0x3f;

          for (j = 0; (j < i + 1); j++)
              ret += base64_chars.charAt(char_array_4[j]);

          while ((i++ < 3))
              ret += '=';

      }

      return ret;



}
于 2015-07-22T19:25:37.747 回答