如何对 URL 进行 BASE64 编码
本文关键字:BASE64 编码 进行 URL | 更新日期: 2023-09-27 18:35:24
我在 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 的任何一方都必须能够正确处理这些字符。
还要看看大卫·哈丁提到的=
、+
和/
的情况,看看提到的任何问题是否适用于你。或者只是使用大卫的答案。
jQuery:谷歌"jquery base64编码"(该网站 plugins.jquery.com 目前似乎处于离线状态,所以我无法确定它)
最好使用以下代码 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 包含无效的 URL 字符。
JavaScript-
var encodedStr = window.btoa("StringToEncode");
var decodedStr = window.atob( encodedStr ); //"StringToEncode"
我不认为尤金·里亚布采夫接受的答案是正确的。如果您尝试使用"''xff",您将看到:
DecodeFrom64(EncodeTo64("'xff")) == "?" (i.e. "'x3f")
原因是ASCIIEncode没有比代码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;
}
对字符串进行编码/解码 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://stackoverflow.com/questions/10773339/how-to-base64-encode-urls");
var dec = Base64UrlEncoder.Decode(enc);