2017-01-13 81 views
2

目前我正在使用一種算法將每個可能字符的普通字符串編碼爲Base36字符串。將字符串編碼爲Base36

我已經嘗試了以下,但它不起作用。

public static String encode(String str) { 
    return new BigInteger(str, 16).toString(36); 
} 

我想這是因爲字符串不只是一個十六進制字符串。如果我使用字符串「Hello22334!」在Base36中,我得到了一個NumberFormatException

我的方法是每一個字符轉換爲數字。將數字轉換爲十六進制表示,然後將十六進制字符串轉換爲Base36。

是我的做法正確的,或者是有一個更簡單的或更好的辦法?

+0

我不明白怎麼「每個可能的字符」並且使用基數爲16的'BigInteger'應該放在一起。您可能需要先將字符串轉換爲字節並將其轉換。請記住,字符串的字節表示取決於使用的編碼,如果不提供編碼,系統將使用默認值(並且在不同系統上運行時可能會更改)。 – Thomas

+0

我剛試過,它不起作用。問題是,我知道沒有可能的解決方案。 –

+2

你可以看看如何實現'java.util.Base64',並將其調整到基數36. – Thomas

回答

8

首先,你需要你的字符串轉換爲數字,由一組字節來表示。這是你使用的編碼。我強烈推薦UTF-8。

然後,你需要轉換這個數字,設置字節字符串,在基地36

byte[] bytes = string.getBytes(StandardCharsets.UTF_8); 
String base36 = new BigInteger(1, bytes).toString(36); 

爲了解碼:

byte[] bytes = new Biginteger(base36, 36).toByteArray(); 
String string = new String(bytes, StandardCharsets.UTF_8); 
+0

謝謝。這很好用!你節省了我的一天:-) –

+0

雖然這使用'BigInteger'拾取,我認爲這是一個奇怪的方法開始。 – greybeard

+1

沒問題。 :)我確實編輯了答案。您可以將'1'作爲第一個參數傳遞給BigInteger構造函數,使其始終爲正數。 如果回答您的問題,請標記接受的答案。 :) –