我有一系列加密字符串,我在C#/ ASP.Net Web应用程序中用作ID。我需要在id
属性中使用这些,但是,字符串包含非法字符(有效字符只有'[A-Za-z0-9 -_:。]`)。我需要一个双向转换,将我的加密字符串映射到这个小集合。像Base64这样的东西,但更小。
我有什么选择?是否有标准算法,或者它是否足够奇怪我必须自己发明它?
解决方案: 如果有人需要这个,这就是我最终做的事情。替换无效字符,并删除padding = char。然后将其撤消以恢复。
private static string MakeReferenceJavascriptCompatible(string reference)
{
return reference.Replace("+", "_")
.Replace("/", "-")
.Replace("=", "");
}
private static string UndoMakeReferenceJavascriptCompatible(string reference)
{
int padding = 4 - (reference.Length % 4);
return reference.Replace("-", "/")
.Replace("_", "+")
.PadRight(reference.Length + padding, '=');
}
答案 0 :(得分:4)
如果你有A-Z(26),a-z(26),0-9(10)和'_',':'和'。' (3)那么你有65个字符可用,就像Base64一样。 (由于最后使用=作为填充,它需要65而不是64。)我不清楚你还是否包括-
,它会给你66 .. 。可用字符中积极富:)
听起来你只需要将“普通”形式转换为略有不同的字母。您可以通过找到灵活的base64实现来执行此操作,该实现允许您指定要使用的值,或者只需调用string.Replace
:
var base64 = Convert.ToBase64String(input)
.Replace('+', '_')
.Replace('/', ':')
.Replace('=', '.');
撤消替换以从“已修改的”base64返回到“普通”base64,它将对Convert.FromBase64String
有效。
答案 1 :(得分:2)
“较小”?在这个问题中,你说的是有66个有效字符:
给Base64一个机会,也许用其他一些字符替换“非法字符”(+,/,=)。
答案 2 :(得分:1)
您已经有65个有效字符可供使用。因此,您可以使用String.Replace
的base64编码。但是如果你想使用不区分大小写的编码(例如用于windows中的文件名)你可以使用base36编码
答案 3 :(得分:0)
您可以使用内置的System.Web.HttpServerUtility来执行此操作。
要将值转换为编码值(对于Url和JavaScript使用是安全的):
string result = value;
if (!string.IsNullOrEmpty(value))
{
var bytes = System.Text.Encoding.UTF8.GetBytes(value);
result = HttpServerUtility.UrlTokenEncode(bytes);
}
return result;
将编码值转换回原始值:
// If a non-base64 string is passed as value, the result will
// be same as the passed value
string result = value;
if (!string.IsNullOrEmpty(value))
{
var bytes = HttpServerUtility.UrlTokenDecode(value);
if (bytes != null) {
result = System.Text.Encoding.UTF8.GetString(bytes);
}
}
return result;