8

現在、可能な各文字を含む通常の文字列を Base36 文字列にエンコードするアルゴリズムに取り組んでいます。

以下を試してみましたが、うまくいきません。

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

文字列が単なる16進文字列ではないためだと思います。「Hello22334!」という文字列を使用すると、Base36 では、NumberFormatException.

私のアプローチは、各文字を数字に変換することです。数値を 16 進数表現に変換してから、16 進文字列を Base36 に変換します。

私のアプローチは大丈夫ですか、それとももっと簡単で良い方法がありますか?

4

2 に答える 2

15

まず、文字列を一連のバイトで表される数値に変換する必要があります。これは、エンコーディングを使用するものです。UTF-8 を強くお勧めします。

次に、その数値、バイトのセットを base 36 の文字列に変換する必要があります。

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

デコードするには:

byte[] bytes = new Biginteger(base36, 36).toByteArray();
// Thanks to @Alok for pointing out the need to remove leading zeroes.
int zeroPrefixLength = zeroPrefixLength(bytes);
String string = new String(bytes, zeroPrefixLength, bytes.length-zeroPrefixLength, StandardCharsets.UTF_8));

private int zeroPrefixLength(final byte[] bytes) {
    for (int i = 0; i < bytes.length; i++) {
        if (bytes[i] != 0) {
            return i;
        }
    }
    return bytes.length;
}
于 2017-01-13T11:45:51.923 に答える