4

与えられた任意の文字セット

String range = "0123456789abcdefghijklmnopABCD#";

長い<->文字列からエンコード/デコードする2つの方法を探しています

String s = encode( range, l );

long l = decode( range, s );

そうdecode(range, encode(range, 123456789L)) == 123456789L

範囲が「0123456789」の場合、それが通常のエンコード方法です。

4

4 に答える 4

13

次のコードは、必要なことを行います。

static long decode(String s, String symbols) {
    final int B = symbols.length();
    long num = 0;
    for (char ch : s.toCharArray()) {
        num *= B;
        num += symbols.indexOf(ch);
    }
    return num;
}
static String encode(long num, String symbols) {
    final int B = symbols.length();
    StringBuilder sb = new StringBuilder();
    while (num != 0) {
        sb.append(symbols.charAt((int) (num % B)));
        num /= B;
    }
    return sb.reverse().toString();
}
public static void main(String[] args) {
    String range = "0123456789abcdefghijklmnopABCD#";
    System.out.println(decode(encode(123456789L, range), range));
    // prints "123456789"

    System.out.println(encode(255L, "0123456789ABCDEF"));
    // prints "FF"

    System.out.println(decode("100", "01234567"));
    // prints "64"
}

これは基本的に、カスタム シンボル セットを使用した基数変換であることに注意してください。

関連する質問

于 2010-05-30T12:16:23.113 に答える
1

これは単に基数変換を実行するだけの問題です。long を文字列の文字数に対応する適切な基数に変換し、範囲文字列を「数字」のセットとして使用するだけです。

たとえば、文字列「0123456789ABCDEF」があるとします。これは、基数 16 の 16 進数に変換する必要があることを意味します。文字列が「01234567」の場合は、基数 8 の 8 進数に変換します。

result = "";
while (number > 0)
{
  result = range[(number % range.length)] + result;
  number = number / 16; //integer division, decimals discarded
}

戻るには、最初の文字を取得し、文字列内のその位置を見つけて、結果に追加します。次に、後続の文字ごとに、次の文字の位置を追加する前に、現在の結果に基数を掛けます。

result = 0;
for (int i = 0; i < input.length; i++)
{
  result = result * range.length;
  result = range.indexOf(input[i])
}
于 2010-05-30T12:04:47.683 に答える
0

Patten と matcher を探します。これが私のスニペットです

private static final String LUCENE_ENCODE_ESCAPE_CHARS = "[\\+\-\!\(\)\:\^\]\{\}\~\*\?]";

private static final String LUCENE_DECODE_ESCAPE_CHARS = "\\\\";
private static final String REPLACEMENT_STRING = "\\\\$0";

private static final Pattern LUCENE_ENCODE_PATTERN = Pattern.compile(LUCENE_ENCODE_ESCAPE_CHARS);
private static final Pattern LUCENE_DECODE_PATTERN = Pattern.compile(LUCENE_DECODE_ESCAPE_CHARS);

@Test
public void test() {

    String encodeMe = "\\ this + is ~ awesome ! ";

    String encode = LUCENE_ENCODE_PATTERN.matcher(encodeMe).replaceAll(REPLACEMENT_STRING);

    String decode = LUCENE_DECODE_PATTERN.matcher(encode).replaceAll("");

    System.out.println("Encode " + encode);
    System.out.println("Decode " + decode);
}
于 2012-12-26T18:54:11.510 に答える