类似于Base64的字符串转换,用于较小的字符集

时间:2012-04-28 19:32:44

标签: c# string encoding

我有一系列加密字符串,我在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, '=');
    }

4 个答案:

答案 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个有效字符:

  • [A-Z]:26
  • [a-z]:26
  • [0-9]:10
  • [-_:。]:4

给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;