构造一个基本的64字符串,直到给定的长度和相同的大小

时间:2017-01-29 16:50:32

标签: c# string azure azure-storage azure-storage-blobs

我正在阅读本教程https://www.simple-talk.com/cloud/platform-as-a-service/azure-blob-storage-part-4-uploading-large-blobs/,以实现此处所述的天蓝色方法https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/put-block

为了实现这个方法,我们需要一个块id:

  1. 标识块的有效Base64字符串值。
  2. 在编码之前,字符串的大小必须小于或等于64字节。
  3. 对于给定的blob,为blockid参数指定的值的长度必须与每个块的大小相同。
  4. 请注意,Base64字符串必须是URL编码的。

    所以为了达到那个作者所说:

      

    "我通常只使用块ID将它们从1编号为任何值   格式化为7个字符的字符串。所以对于1,我会得到“0000001”。   请注意,块id必须是基本的64字符串。"

    并使用此代码:

    string blockId = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(string.Format("BlockId{0}",blockNumber.ToString("0000000"))));
    

    现在,毫无疑问这是Base64,但她如何实现条件2和  3.因为格式化为" 0000000"意思是23转换为" 0000023"但超过7位的数字将保持不变前#9; 999888777"哪一个  违反3条件,并考虑7位数,她是如何能够的  实现条件2的64字节字符串。

1 个答案:

答案 0 :(得分:1)

如果你看#3,那么块id必须是相同的长度。因此,如果您使用:

string blockId = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(string.Format("BlockId{0}",blockNumber.ToString("0000000"))));

您基本上说的是,最大块ID(或您的案例中的块号)将为9999999。如果您认为需要使用超过7个字符的块ID(比如从100000000开始的9个字符),那么您将使用如下代码:

string blockId = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(string.Format("BlockId{0}",blockNumber.ToString("000000000"))));

然后所有块id将具有相同的长度。

无论您选择哪种顺序,您只需确保在将该序列中的任何数字转换为字符串时,所有这些数字必须具有相同的长度。

我想提及的其他一些事情是:

  • blob最多可以有50000个块。您不能以超过50,000个块(块)拆分文件,以将其作为块上传。
  • 上传块时,您可以按任意顺序上传它们,即您可以先上传块#999,然后上传块#0。重要的是提交阻止列表的有效负载。构造并保存在blob存储中的最后一个blob基于提交阻止列表中指定的块ID顺序。

对我来说有用的是以下代码(假设块ID号是从0开始的连续数字):

string blockId = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(string.Format("BlockId{0}",blockNumber.ToString("d6"))));