2

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

4 に答える 4

4

If you've got A-Z (26), a-z (26), 0-9 (10) and '_', ':' and '.' (3) then you've got 65 characters available, just like Base64. (It needs 65 rather than 64 due to using = as padding at the end.) It wasn't clear to me whether you also were including -, which would give you 66... positively rich in characters available :)

It sounds like you just need to convert the "normal" form to your slightly different alphabet. You could do this either by finding a flexible base64 implementation which lets you specify the values to use, or by just calling string.Replace:

var base64 = Convert.ToBase64String(input)
                    .Replace('+', '_')
                    .Replace('/', ':')
                    .Replace('=', '.');

Reverse the replacements to get back from your "modified" base64 to "normal" base64 and it'll be valid for Convert.FromBase64String.

于 2012-04-28T19:36:03.973 に答える
2

「小さい」?質問では、66 の有効な文字があると述べています。

  • [AZ] : 26
  • [az] : 26
  • [0-9] : 10
  • [-_:.]: 4

Base64 にチャンスを与えて、「不正な文字」(+、/、=) を他の文字に置き換えてください。

于 2012-04-28T19:37:52.473 に答える
1

使用できる有効な文字はすでに 65 文字あります。したがって、base64 エンコーディングを で使用できますString.Replace。ただし、大文字と小文字を区別しないエンコーディングを使用する場合 (たとえば、Windows でファイル名に使用する場合)、base36エンコーディングを使用できます。

于 2012-04-28T19:48:33.053 に答える
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;
于 2015-07-08T13:07:02.060 に答える