2011-01-11 6 views
0

Я работаю над небольшой задачей, для которой требуется некоторая кодировка base64. Я пытаюсь сделать это в голове, но теряюсь.цифры длиной до base64 символов

У меня есть 13-значный номер в Java длинном формате сказать: 1294705313608, 1294705313594, 1294705313573

Я некоторую обработку с ним, Bascially я беру этот номер добавить его с вещами поместить его в массив байтов, а затем преобразовать это base64 с помощью:

String b64String = new sun.misc.BASE64Encoder().encodeBuffer(bArray); 

Теперь я знаю, что для исходного числа, первые 3 цифры никогда не изменится. Таким образом, 129 является постоянным в числах выше. Я хочу узнать, сколько символов, соответствующих этим цифрам, не изменилось бы в итоговой строке base64.

Код для сериализации длинного массива байтов. Я игнорирую первые 2 байта, так как они всегда равны 0:

bArray [0] = (байт) (время >>> 40);
bArray [1] = (байт) (время >>> 32);
bArray [2] = (байт) (время >>> 24);
bArray [3] = (байт) (время >>> 16);
bArray [4] = (байт) (время >>> 8);
bArray [5] = (байт) (время >>> 0);

Спасибо.

Примечания: Я знаю, что base64 займет 6 бит и сделает из него один символ. Итак, если первые 3 цифры не изменяются долго, сколько символов не изменится в base64. Это НЕ назначение HW, но я не очень хорошо разбираюсь в кодировании.

+0

Я думаю, что это домашнее задание, но не помечено так. –

+0

Можете ли вы опубликовать код, который вы используете для сериализации длинного массива байтов с другим «материалом»? – dkarp

+0

@dkarp: Я опубликовал код. – codeObserver

ответ

1

1290000000000 is 10010110001011001111111011110010000000000 в двоичном формате.
1299999999999 является 10010111010101110000010011100011111111111 в двоичном формате.

Оба имеют длину 41 бит, и они отличаются после первых 7 бит. Ваш сдвиг помещает биты 41-48 в первый байт, который всегда будет 00000001. Следующий байт всегда будет 00101110, 00101101, или 00101110. Таким образом, у вас есть ведущие 14 бит для всех возможных значений массива, которые (по 6 бит на кодированный base64 char) означают 2 символа, общие в закодированной строке.

+1

Честно говоря, это, наверное, проще закодировать и протестировать, чем объяснить ... – dkarp

+0

Thnx dkarpp, я путаюсь между «они отличаются после первых 7 бит» и «у вас есть получил ведущие 14 бит среди всех возможных значений массива "... 7 бит могут сделать 3-значное число, и, следовательно, я могу понять, что первые 3 цифры в длинном не изменяются .... Таким образом, 7 бит будут соответствовать только 1 base64char .. так что только 1 символ не должен меняться ?? .. Можете ли вы еще раз объяснить, как вы получили 14 бит? , thnx again..I запрограммировал его, и поскольку вы можете видеть, что long - timestmp .. – codeObserver

+0

, так что для 2 разных времен я получил эти цифры.nos после добавления активного байтового массива wth больше байтов, поэтому игнорируйте его длину: – codeObserver

0

Появляется, что вы на правильном пути. Я думаю, что вы хотите преобразовать длинный массив в байты, а затем преобразовать массив байтов в Base64.

How do I convert Long to byte[] and back in java показывает, как его преобразовать в байты.

Смежные вопросы