gpt4 book ai didi

.net - HttpServerUtility.UrlTokenEncode 替换 netstandard

转载 作者:行者123 更新时间:2023-12-03 02:17:55 24 4
gpt4 key购买 nike

我正在将一个针对 net472 的项目移植到 netstandard。我遇到的最后一个 System.Web 依赖项是 HttpServerUtility.UrlTokenEncode(Byte[]) .

我找到了Microsoft.AspNetCore.WebUtilities ,其中包含 Base64UrlTextEncoderWebEncoders ,但它们不能与 UrlTokenEncode/Decode 互换,因为它附加/期望 = padding characters 的数量。最后,例如:

var data = Encoding.UTF8.GetBytes("SO");
Convert.ToBase64String(data); // U08=
HttpServerUtility.UrlTokenEncode(data); // U081 - this is what's expected and
// the only thing UrlTokenDecode can handle
Base64UrlTextEncoder.Encode(data); // U08
WebEncoders.Base64UrlEncode(data); // U08

据我所知,没有其他差异(我使用随机字符串进行了测试),但它还引入了一些其他依赖项(Microsoft.Net.Http.Headers 和 Microsoft.Extensions.Primitives),我认为在该项目中并不真正需要。

是否有任何 nuget 软件包可以直接替换?如果没有的话,我正在考虑自己实现。

最佳答案

对于那些寻找这个已删除实用方法的答案并希望迁移遗留应用程序的人,我已经从 M$ 源代码中进行了一些摘录。

   private static string UrlTokenEncode(byte[] input)
{
if (input == null)
throw new ArgumentNullException("input");
if (input.Length < 1)
return String.Empty;
char[] base64Chars = null;

////////////////////////////////////////////////////////
// Step 1: Do a Base64 encoding
string base64Str = Convert.ToBase64String(input);
if (base64Str == null)
return null;

int endPos;
////////////////////////////////////////////////////////
// Step 2: Find how many padding chars are present in the end
for (endPos = base64Str.Length; endPos > 0; endPos--)
{
if (base64Str[endPos - 1] != '=') // Found a non-padding char!
{
break; // Stop here
}
}

////////////////////////////////////////////////////////
// Step 3: Create char array to store all non-padding chars,
// plus a char to indicate how many padding chars are needed
base64Chars = new char[endPos + 1];
base64Chars[endPos] = (char)((int)'0' + base64Str.Length - endPos); // Store a char at the end, to indicate how many padding chars are needed

////////////////////////////////////////////////////////
// Step 3: Copy in the other chars. Transform the "+" to "-", and "/" to "_"
for (int iter = 0; iter < endPos; iter++)
{
char c = base64Str[iter];

switch (c)
{
case '+':
base64Chars[iter] = '-';
break;

case '/':
base64Chars[iter] = '_';
break;

case '=':
Debug.Assert(false);
base64Chars[iter] = c;
break;

default:
base64Chars[iter] = c;
break;
}
}
return new string(base64Chars);
}

private static byte[] UrlTokenDecode(string input)
{
if (input == null)
throw new ArgumentNullException("input");

int len = input.Length;
if (len < 1)
return new byte[0];

///////////////////////////////////////////////////////////////////
// Step 1: Calculate the number of padding chars to append to this string.
// The number of padding chars to append is stored in the last char of the string.
int numPadChars = (int)input[len - 1] - (int)'0';
if (numPadChars < 0 || numPadChars > 10)
return null;


///////////////////////////////////////////////////////////////////
// Step 2: Create array to store the chars (not including the last char)
// and the padding chars
char[] base64Chars = new char[len - 1 + numPadChars];


////////////////////////////////////////////////////////
// Step 3: Copy in the chars. Transform the "-" to "+", and "*" to "/"
for (int iter = 0; iter < len - 1; iter++)
{
char c = input[iter];

switch (c)
{
case '-':
base64Chars[iter] = '+';
break;

case '_':
base64Chars[iter] = '/';
break;

default:
base64Chars[iter] = c;
break;
}
}

////////////////////////////////////////////////////////
// Step 4: Add padding chars
for (int iter = len - 1; iter < base64Chars.Length; iter++)
{
base64Chars[iter] = '=';
}

// Do the actual conversion
return Convert.FromBase64CharArray(base64Chars, 0, base64Chars.Length);
}

关于.net - HttpServerUtility.UrlTokenEncode 替换 netstandard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50731397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com