2012年2月26日

【Java】10進62進変換コード

今回は簡単なメソッドの共有

GitHubに上げようかと思いましたが、未だに使い方がよく分からないので、
ブログにそのまま書いちゃいます。

10進はlong, 62進は[0-9a-zA-Z]の62文字です。


作ってて思ったのですが、絶対どこかにある確信があるのですが、
Google先生がうまいこと検索してくれませんので、勝手に作りました。

AlphaNumericConvert.java

package java.util.encryption;

import java.util.regex.Pattern;

/** convert integer to alphanumeric string or alphanumeric string to integer
 * 
 * @author dommy <shonan.shachu at gmail.com>
 * @version 1.0.0 updated on 2012-02-24
 */
public class AlphaNumeric {
  private static final String TABLE = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

  /** concatenate integers
   * 
   * @param digits
   * @return string value of concatenated integers
   */
  public static long concatnateDigits(int... digits){
    StringBuffer sb = new StringBuffer(digits.length);
    for(int digit: digits){
      sb.append(digit);
    }
    return Long.parseLong(sb.toString());
  }

  /** convert integer to alphanumeric characters
   * 
   * @param number
   * @return encrypted string
   */
  public static String encrypt(long number) {
    StringBuffer sb = new StringBuffer();
    while(number > 0) {
      sb.insert(0, TABLE.charAt((int)(number % 62)));
      number = number / 62;
    }
    return sb.toString();
  }

  /** convert alphanumeric characters to integer
   * 
   * @param phrase
   * @return Integer converted from phrase.
   *         Return -1 if the phrase contains not convertible character.
   */
  public static long decrypt(String phrase) {
    // validation.
    // if the phrase has character other than in TABLE
    // return -1;
    if(Pattern.compile("[^" + TABLE + "]").matcher(phrase).find()){
      return -1;
    }
    String reverse = new StringBuffer(phrase).reverse().toString();
    long decimal = 0;
    for(int i = 0; i < reverse.length(); i++){
      int digit = TABLE.indexOf(reverse.charAt(i));
      decimal = (long) (decimal + digit * Math.pow(62, i));
    }
    return decimal;
  }
}