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;
}
}
0 件のコメント:
コメントを投稿