首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用什么字节编码来计算分块上传的Amazon-S3 ETag?

使用什么字节编码来计算分块上传的Amazon-S3 ETag?
EN

Stack Overflow用户
提问于 2016-05-18 00:40:54
回答 1查看 506关注 0票数 0

请参考此链接中的讨论:

What is the algorithm to compute the Amazon-S3 Etag for a file larger than 5GB?

重新创建MD5散列的步骤是: 1)连接每个上传部分的md5散列,2)将连接的散列转换为二进制,3)获得二进制的md5散列,然后4)将连字符和部分的数量添加到散列中。这一切听起来都很简单,但我正在努力的是在步骤3中。为了获得二进制文件的散列,我需要将字符串转换为字节数组。要获得字节数组,我需要知道要使用的编码格式。这就是我漏掉的部分。我是用ASCII,UTF8,Unicode,BigEndian,还是别的什么?

我尝试使用上述四种格式,但没有一种格式产生正确的散列。我就是想不通这件事。我使用的代码是:

代码语言:javascript
复制
CompleteMultipartUploadResponse compResp = new CompleteMultipartUploadResponse();
CompleteMultipartUploadRequest compReq = new CompleteMultipartUploadRequest();
string requestETagHash = "";

compResp = client.CompleteMultipartUpload(compReq);
string compETag = compResp.ETag;                                            
foreach (PartETag s in compReq.PartETags)
{
    requestETagHash += s.ETag.Replace('\"', ' ').Trim().Split('-').First();
}

StringBuilder sb = new StringBuilder();
foreach (char c in requestETagHash)
{
    try
    {
         sb.AppendFormat(Convert.ToString(Convert.ToInt16(c.ToString(), 16), 2).PadLeft(4, '0'));
    }
    catch (Exception ex)
    {
        MessageBox.Show("Hash error:\n\n" + ex.Message);
    }
}
//What encoding is used in this line?
byte[] b = System.Text.Encoding.UTF8.GetBytes(sb.ToString());

byte[] data = md5Hash.ComputeHash(b, 0, b.Length);

StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
    sBuilder.Append(data[i].ToString("x2"));
}

任何人在解决这个问题上都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2016-05-18 03:27:57

问题解决了。谢谢,乔恩!你关于我延迟获取散列的评论让我思考在哪里可以找到散列的字节数组和我正在使用的十六进制值。我修改了我的代码,在上传每个文件部分后立即获得并连接散列字节数组。然后,在接收到CompleteMultiPartUploadResponse响应后,我对连接的数组进行散列,结果,我得到的散列与从S3返回的完成上传的eTag的散列相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37281979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档