Почему base64_encode() добавляет слэш "/" в результате?
Я кодирую суффикс URL моего приложения:
$url = 'subjects?_d=1';
echo base64_encode($url);
// Outputs
c3ViamVjdHM/X2Q9MQ==
Обратите внимание на косую черту перед "X2".
Почему это происходит? Я думал, что base64 выводит только A-Z, 0-9 и '=' в качестве дополнения? Я пробовал использовать онлайн-кодировщик base64 для проверки, и кажется, что base64 всегда это делает. Я не могу сказать, подчеркивает ли это символ "_" или знак вопроса "?" или "=" возможно?
Ответы
Ответ 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...