如何BASE64编码URL?

时间:2012-05-27 10:44:57

标签: c# jquery base64

我在KickAssTorrents.com上浏览种子,当我访问链接时,它以不同的方式在网址中编码;

例如(IMDb链接):http://kat.ph/account/confirm/url/aHR0cDovL3d3dy5pbWRiLmNvbS90aXRsZS90dDA0MDE3Mjk=/

现在,当我更改角色时链接中的某些内容发生了变化,我想知道如何在C#或jQuery中执行此操作?!

4 个答案:

答案 0 :(得分:7)

在C#中:

static public string EncodeTo64(string toEncode) {
    byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
    string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
    return returnValue;
}
static public string DecodeFrom64(string encodedData) {
    byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);
    string returnValue = System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes);
    return returnValue;
}
MessageBox.Show(DecodeFrom64("aHR0cDovL3d3dy5pbWRiLmNvbS90aXRsZS90dDA0MDE3Mjk="));

如果字符串System.Text.UTF8Encoding.UTF8.GetBytes(...)包含ASCII以外的字符,请使用toEncode。请注意,在这种情况下,解码URL的任何一方都必须能够正确处理这些字符。

另请查看David Hardin提到的=+/的{​​{3}},看看是否有任何问题适用于您。或者只使用David的the case

jQuery:google'jquery base64 encode'(网站plugins.jquery.com目前似乎处于离线状态,所以我无法检查它)

答案 1 :(得分:3)

最好使用https://stackoverflow.com/a/1789179

下面的代码
///<summary>
/// Base 64 Encoding with URL and Filename Safe Alphabet using UTF-8 character set.
///</summary>
///<param name="str">The origianl string</param>
///<returns>The Base64 encoded string</returns>
public static string Base64ForUrlEncode(string str)
{
    byte[] encbuff = Encoding.UTF8.GetBytes(str);
    return HttpServerUtility.UrlTokenEncode(encbuff);
}
///<summary>
/// Decode Base64 encoded string with URL and Filename Safe Alphabet using UTF-8.
///</summary>
///<param name="str">Base64 code</param>
///<returns>The decoded string.</returns>
public static string Base64ForUrlDecode(string str)
{
    byte[] decbuff = HttpServerUtility.UrlTokenDecode(str);
    return Encoding.UTF8.GetString(decbuff);
}

原因是Base64包含无效的网址字符。

答案 2 :(得分:2)

的JavaScript -

var encodedStr = window.btoa("StringToEncode");

var decodedStr = window.atob( encodedStr );  //"StringToEncode"

答案 3 :(得分:0)

我不认为Eugene Ryabtsev接受的答案是正确的。 如果您使用“\ xff”进行尝试,您会看到:

DecodeFrom64(EncodeTo64("\xff")) == "?" (i.e. "\x3f")

原因是ASCIIEncoding不会比代码127更进一步。从128到255的所有字符都将被理解,并将被转换为“?”。

因此,需要扩展编码如下:

static public string EncodeTo64(string toEncode) {
    var e = Encoding.GetEncoding("iso-8859-1");
    byte[] toEncodeAsBytes = e.GetBytes(toEncode);
    string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
    return returnValue;
}
static public string DecodeFrom64(string encodedData) {
    var e = Encoding.GetEncoding("iso-8859-1");
    byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);
    string returnValue = e.GetString(encodedDataAsBytes);
    return returnValue;
}