2014-09-21 54 views
-2

我需要從double創建一個String(有點像加密),所以如果它是16個字符長度,則有62^16(26個大寫字母,26小寫字母,10個數字,^ 16個字符)的可能性。我不知道該怎麼做。創建雙字符串(62^16 =「ZZZZZZZZZZZZZZZZ」)

所以最後一個應該是「ZZZZZZZZZZZZZZZZ」
,第一個「0000000000000001」
第二個「0000000000000002」
的第62屆一個「000000000000000Z」
和第63一個「0000000000000010」。

我希望你明白。

+0

一個'int'不夠大,不足以支持62^16個不同的值。 – 2014-09-21 09:58:48

+0

哦,對不起,在我的代碼中我使用了雙打。工作得很好,但你是對的。我會編輯它:) – Addi 2014-09-21 10:05:32

+1

'double'也不足以支持62^16個不同的值。 – 2014-09-21 10:12:36

回答

1

您必須使用BigInteger對象來存儲您的號碼。 (0)「0000000000000000」,最後一個是(62^16 - 1)「ZZZZZZZZZZZZZZZZ」。

private static final BigInteger BIG_INTEGER_62 = BigInteger.valueOf(62); 

public static void main(String[] args) { 
    System.out.println(encryptInteger(BigInteger.valueOf(0))); 
    System.out.println(encryptInteger(BigInteger.valueOf(1))); 
    System.out.println(encryptInteger(BigInteger.valueOf(62))); 
    System.out.println(encryptInteger(BigInteger.valueOf(63))); 
    System.out.println(encryptInteger(BIG_INTEGER_62.pow(16).subtract(BigInteger.valueOf(1)))); 
} 

private static String encryptInteger(BigInteger number) { 
    StringBuilder builder = new StringBuilder(16); 
    for(int i = 0; i < 16; i++) { 
     builder.append(intToChar(number.divide(BIG_INTEGER_62.pow(i)).mod(BIG_INTEGER_62).intValue())); 
    } 
    return builder.reverse().toString(); 
} 

private static char intToChar(int value) { 
    if(value < 0) 
     return '<'; 
    if(value < 10) 
     return (char) ('0' + value); 
    if(value < 36) 
     return (char) ('a' - 10 + value); 
    if(value < 62) 
     return (char) ('A' - 36 + value); 
    return '>'; 
} 
+0

謝謝:D我剛剛發現了一個解決方案,只需要使用一個數組,如果整數:)你的可能比我的好:) – Addi 2014-09-21 10:38:00

+0

@Addi:你爲什麼不只是使用一個字符數組,AKA你已經擁有的字符串? – 2014-09-21 10:40:05

+0

你如何獲得這些數組?我以爲你從一個數字開始,而不是從範圍從0到61的一系列數字。 – Bilbo 2014-09-21 10:46:27

0

好,努力一點後,我決定使用int數組來代替:

`public static String salat(int input[]) 
{ 
    String ret =""; 
    String[] chars = new String[16]; 
    char[] dict62="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); 
    for(int i = 0; i< 16; i++) 
    { 
     chars[i]=String.valueOf(dict62[input[i]]); 
     ret=ret+chars[i]; 
    } 
    return ret; 
}` 

所以

salat(new int[]{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}); 

將返回baaaaaaaaaaaaaaa :)是陣列所需的唯一問題。 有點亂,但它的作品;) btw:「salat」只是在德國的沙拉:D