Я читал так много тем по этому вопросу до сих пор, я не могу понять, где может быть проблема. Я шифрую часть URL-адреса из приложения winform C #. Затем я хочу прочитать URL-адрес с помощью php и расшифровать URL-адрес (все используют base-64). У меня есть какой-то код, который нужно разглядеть:
public static string Base64Encode(string str) { byte[] encbuff = Encoding.UTF8.GetBytes(str); return System.Web.HttpServerUtility.UrlTokenEncode(encbuff); }
Расшифруйте раздел URL-адреса:
Base64Encode("CND0311J4S68CCU Ver. F.0BHPQOEM - f");
Возвращает:
Q05EMDMxMUo0UzY4Q0NVIFZlci4gRi4wQkhQUU9FTSAtIGY1
echo base64_decode("Q05EMDMxMUo0UzY4Q0NVIFZlci4gRi4wQkhQUU9FTSAtIGY1");
Возвращает:
CND0311J4S68CCU Ver. F.0BHPQOEM - f5
Итак, где дополнительные «5» в конце возвращения? Я не могу понять это для жизни меня, довольно разочаровывающей, как вы могли себе представить.
Я ценю любую помощь с этим – и любые предложения!
Спасибо,
Evan
"CND0311J4S68CCU Ver. F.0BHPQOEM - f"
закодированный как base64, не является:
Q05EMDMxMUo0UzY4Q0NVIFZlci4gRi4wQkhQUU9FTSAtIGY1
Возможно, что-то еще добавляет 1
в конец, потому что
echo base64_decode("Q05EMDMxMUo0UzY4Q0NVIFZlci4gRi4wQkhQUU9FTSAtIGY");
дает вам то, что вы ищете. И что-то добавляет его на самом деле System.Web.HttpServerUtility.UrlTokenEncode
. Проблема заключается в следующем ( из MSDN ):
Этот (
System.Web.HttpServerUtility.UrlTokenEncode
) не использует стандартную кодировку. Он кодирует символы – и _, которые являются стандартными. Он также удаляет знаки =. Но вместо того, чтобы просто удалять их (они не нужны для декодирования строки), он заменяет их цифрой (0, 1, 2), указывающей число = знаков, которые были удалены.
Так что идите ( Demo ):
<?php $urltoken = "Q05EMDMxMUo0UzY4Q0NVIFZlci4gRi4wQkhQUU9FTSAtIGY1"; echo urltoken_decode($urltoken); function urltoken_decode($token) { return base64_decode(substr($token, 0, -1)); }
Функция довольно грубая и может быть улучшена, чтобы действительно иметь дело с ней более конкретно ( Demo2 ):
function urltoken_decode($token) { $len = strlen($token); if (!$len) return $token; $digit = $token[$len-1]; if (!in_array($digit, range(0,2))) { throw InvalidArgumentException(sprintf('Invalid end digit (%s).', $digit)); } return base64_decode(substr($token, 0, -1)); }
Интересно – когда я кодирую «CND0311J4S68CCU Ver. F.0BHPQOEM – f» на этом сайте (используя JavaScript), он кодируется как «Q05EMDMxMUo0UzY4Q0NVIFZlci4gRi4wQkhQUU9FTSAtIGY». Если я декодирую «Q05EMDMxMUo0UzY4Q0NVIFZlci4gRi4wQkhQUU9FTSAtIGY1», я получаю дополнительные 5 на конце. По-видимому, проблема заключается в конце кодирования – возможно, попытайтесь вывести значение, которое вы кодируете, прежде чем оно будет передано кодеку base64, чтобы убедиться, что это именно то, что вы думаете?