Преобразовать двоичное число в Base 64 - PullRequest
2 голосов
/ 30 сентября 2011

Я знаю, что это довольно глупый вопрос, но я не знаю, что делать.

У меня есть произвольное двоичное число, скажем,

1001000000110010000000100100000010000011000000010001000001011000110000110000011100011100000011000000010010011000100000000000000100100000010110001100001000000111

Я хочу преобразовать его в Base 64 с помощью PHP - и каждый способ, который я пробую, дает мне другой результат. Даже разные онлайн-конвертеры конвертируют его по-разному:

http://home2.paulschou.net/tools/xlate/
http://convertxy.com/index.php/numberbases/

PHP base_convert работает только до base36, а base64_encode ожидает строку.

Что мне делать?

ОБНОВЛЕНИЕ : Я реализовал функции решения, предложенные @ binaryLV , и он работал хорошо.

Однако я сравнил результаты со встроенным в PHP base_convert . Оказалось, что base_convert to base36 возвращает более короткие значения, чем пользовательская функция base64! (И да, я добавлял «1» ко всем двоичным числам, чтобы гарантировать, что начальные нули не потеряны).

Я также заметил, что base_convert довольно неточно с большими числами. Так что мне нужна функция, которая работает как base_convert, но точно и, желательно, до base 64.

Ответы [ 4 ]

3 голосов
/ 30 сентября 2011

Длина строки в примере составляет 160. Это заставляет меня думать, что она содержит информацию о 160/8 символов. Таким образом,

  1. разбить строку на части, каждая часть содержит 8 двоичных цифр и описывает один символ
  2. преобразовать каждую часть в десятичное целое число
  3. строит строку из символов, которые сделаны из кодов ASCII со второго шага

Это будет работать со строками размером n*8. Для других строк (например, 12 двоичных цифр) это даст неожиданные результаты.

Код:

function bin2base64($bin) {
    $arr = str_split($bin, 8);
    $str = '';
    foreach ( $arr as $binNumber ) {
        $str .= chr(bindec($binNumber));
    }
    return base64_encode($str);
}

$bin = '1001000000110010000000100100000010000011000000010001000001011000110000110000011100011100000011000000010010011000100000000000000100100000010110001100001000000111';
echo bin2base64($bin);

Результат:

kDICQIMBEFjDBxwMBJiAASBYwgc=

Вот также функция для декодирования обратно в строку двоичных цифр:

function base64bin($str) {
    $result = '';
    $str = base64_decode($str);
    $len = strlen($str);
    for ( $n = 0; $n < $len; $n++ ) {
        $result .= str_pad(decbin(ord($str[$n])), 8, '0', STR_PAD_LEFT);
    }
    return $result;
}

var_dump(base64bin(bin2base64($bin)) === $bin);

Результат:

boolean true
2 голосов
/ 30 сентября 2011

PHP имеет встроенную функцию кодирования base 64, см. Документацию здесь . Если вы хотите, чтобы десятичное значение двоичной строки сначала использовалось bin2dec , кстати, существуют аналогичные функции для шестнадцатеричных чисел. Документация - твой друг здесь.

[EDIT]

Возможно, я неправильно понял ваш вопрос, если вы хотите конвертировать между реальными базами (базы 2 и 64) используйте base_convert

0 голосов
/ 30 сентября 2011
$number = 1001000000110010000000100100000010000011000000010001000001011000110000110000011100011100000011000000010010011000100000000000000100100000010110001100001000000111;
echo base64_encode ($number);

Это если вы хотите, чтобы точная строка была преобразована в Base 64.

0 голосов
/ 30 сентября 2011

Чтобы преобразовать двоичное число (2 основания) в 64 основания, используйте функцию base_convert .

$number = 1001000000110010000000100100000010000011000000010001000001011000110000110000011100011100000011000000010010011000100000000000000100100000010110001100001000000111;
base_convert ($number , 2, 64);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...