我正在浏览KickAssTorrents.com的种子,当我访问一个链接时,它的url以不同的方式进行编码;例如(IMDb链接):http://kat.ph/account/confirm/url/aHR0cDovL3d3dy5pbWRiLmNvbS90aXRsZS90dDA0MDE3Mjk=/。现在,当我更改一个字符时,链接中的某些内容会发生变化,我想知道如何在C#或jQuery中实现这一点?
在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="));
toEncode
中包含ASCII之外的字符,使用System.Text.UTF8Encoding.UTF8.GetBytes(...)
函数进行编码。请注意,在这种情况下,任何解码URL的一方都必须能够正确处理这些字符。=
、+
和/
的案例,看看涉及的问题是否适用于您。或者直接使用David的答案。建议使用以下代码,来源于https://dev59.com/13M_5IYBdhLWcg3wymU0#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);
}
JavaScript-
var encodedStr = window.btoa("StringToEncode");
var decodedStr = window.atob( encodedStr ); //"StringToEncode"
将字符串编码/解码为Base64 Url Safe(更多信息:https://en.wikipedia.org/wiki/Base64#URL_applications),我发现最好的方法是使用Microsoft.IdentityModel.Tokens
命名空间中的Base64UrlEncoder
https://learn.microsoft.com/en-us/dotnet/api/microsoft.identitymodel.tokens.base64urlencoder?view=msal-web-dotnet-latest
var enc = Base64UrlEncoder.Encode("https://dev59.com/hWTWa4cB1Zd3GeqPB0yj");
var dec = Base64UrlEncoder.Decode(enc);
我不认为 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;
}