Подтвердить что ты не робот

Почему base64_encode() добавляет слэш "/" в результате?

Я кодирую суффикс URL моего приложения:

$url = 'subjects?_d=1';
echo base64_encode($url);

// Outputs
c3ViamVjdHM/X2Q9MQ==

Обратите внимание на косую черту перед "X2".

Почему это происходит? Я думал, что base64 выводит только A-Z, 0-9 и '=' в качестве дополнения? Я пробовал использовать онлайн-кодировщик base64 для проверки, и кажется, что base64 всегда это делает. Я не могу сказать, подчеркивает ли это символ "_" или знак вопроса "?" или "=" возможно?

4b9b3361

Ответ 1

Нет. Алфавит Base64 включает в себя A-Z, a-z, 0-9 и + и /.

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

Смотрите: http://en.wikipedia.org/wiki/Base64#Variants_summary_table

Вы можете использовать что-то подобное, чтобы вместо этого использовать свои собственные символы (замените - и _ на все, что хотите, если это не в базовом алфавите base64, конечно!).

Следующий пример преобразует нормальный base64 в base64url как указано в RFC 4648:

function base64url_encode($s) {
    return str_replace(array('+', '/'), array('-', '_'), base64_encode($s));
}

function base64url_decode($s) {
    return base64_decode(str_replace(array('-', '_'), array('+', '/'), $s));
}

Ответ 2

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

Ответ 3

Извините, вы ошибались. A-Za-z0-9 получает только 62 символа. Base64 использует два дополнительных символа в случае PHP / и +.

Ответ 4

В этом нет ничего особенного.

В базовом 64-битном алфавите или в цифрах есть A-Z, a-z, 0-9 плюс два дополнительных символа + (плюс) и/(косая черта).

Вы можете позже кодировать/с% 2f, если хотите.

Ответ 5

A-Z - 26 символов. 0-9 - 10 символов. = один символ. Это дает в общей сложности 37 символов, что немного отличается от 64.

/ - один из 64 символов. Вы можете увидеть полный список страницу wikipedia.

Ответ 6

Для base64 действительная кодировка: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 +/

the = используется как наполнитель для последних байтов

М.

Ответ 7

Не связано напрямую, и достаточное количество людей выше ответили и объяснили решения достаточно хорошо.

Однако, немного отставая от объема вещей. Если вам нужен читаемый базовый текст, попробуйте изучить Base58. Это стоит рассмотреть, если вы хотите только буквенно-цифровые символы.

Ответ 8

Надеюсь, это поможет вам

public function generate_key($s) {
    return str_replace(array('+', '/'), array('-', '_'), base64_encode($s));
}
$randomKey = generate_key(openssl_random_pseudo_bytes(12)); //you can change this number for different length of keys in base64 format

Вы можете декодировать вышеуказанный ключ с помощью этой функции ниже. Просто передайте зашифрованную строку здесь

function key_decode($s) {
    return base64_decode(str_replace(array('-', '_'), array('+', '/'), $s));
}

нет необходимости декодировать openssl_random_pseudo_bytes(), но вы можете использовать это для других случаев, таких как декодирование url...