对可能包含斜杠的字符串进行编码和解码



我有这样的字符串:

RowKey = "Local (Automatic/Manual) Tests",

当我尝试在Windows Azure中存储时,这会失败,因为我认为它不接受"/"作为行键的一部分。

是否有一个简单的方法,我可以编码的值之前放入RowKey?

同样,一旦数据在表中,我用以下命令将其取出:

var Stores = storeTable.GetAll(u => u.PartitionKey == "ABC");

是否有一个简单的方法,我可以得到RowKey的值和解码它?

一种可能的处理方法是转换Base64编码字符串中的PartitionKey和RowKey值并保存它。稍后当您检索这些值时,只需对其进行解码。事实上,我有这个问题几天前在我们的工具和Base64编码建议我在MSDN论坛:http://social.msdn.microsoft.com/Forums/en-US/windowsazuredata/thread/a20cd3ce-20cb-4273-a1f2-b92a354bd868。但这也不是万无一失的。

我不熟悉Azure,所以我不知道是否有一个现有的API。但是编写代码并不难:

编码:

const string escapeChar='|';
RowKey.Replace(escapeChar,escapeChar+escapeChar).Replace("/",escapeChar+"S");

解码:

StringBuilder sb=new StringBuilder(s.Length);
bool escape=false;
foreach(char c in s)
{
  if(escape)
  {
    if(c=='S')
      sb.Append('/');
    else if(c==escapeChar)
      sb.Append(escapeChar);
    else
      throw new ArgumentException("Invalid escape sequence "+escapeChar+c);
  }
  else if(c!=escapeChar)
  {
    sb.Append(c);
    escape=false;
  }
  else
    escape=true;
  return sb.ToString();

当字符串是Base64编码时,在Azure表存储键列中唯一无效的字符是正斜杠('/')。要解决这个问题,只需将正斜杠字符替换为另一个字符(1)在Azure表存储键列中有效,(2)不是Base64字符。我发现的最常见的例子(在其他答案中引用)是用下划线(_)替换正斜杠('/')。

private static String EncodeToKey(String originalKey)
{
    var keyBytes = System.Text.Encoding.UTF8.GetBytes(originalKey);
    var base64 = System.Convert.ToBase64String(keyBytes);
    return base64.Replace('/','_');
}

解码时,只需撤销替换的字符(首先!),然后Base64解码结果字符串。这就是它的全部。

private static String DecodeFromKey(String encodedKey)
{
    var base64 = encodedKey.Replace('_', '/');
    byte[] bytes = System.Convert.FromBase64String(base64);
    return System.Text.Encoding.UTF8.GetString(bytes);
}

一些人建议其他Base64字符也需要编码。根据Azure表存储文档,情况并非如此。

相关内容

  • 没有找到相关文章

最新更新