在Delphi Indy10中为Amazon MWS计算base64编码的MD5哈希

在Delphi Indy10中为Amazon MWS计算base64编码的MD5哈希,delphi,amazon-web-services,delphi-xe2,indy10,Delphi,Amazon Web Services,Delphi Xe2,Indy10,我正在尝试向Amazon MWS提交一个提要。问题是Amazon说我提交的Md5哈希与他们的计算不匹配,所以我的请求被拒绝了 这是我用来计算散列的代码: var StringStream: TStringStream; MessageDigest: TIdHashMessageDigest5; XMLString: string; begin MessageDigest := TIdHashMessageDigest

我正在尝试向Amazon MWS提交一个提要。问题是Amazon说我提交的Md5哈希与他们的计算不匹配,所以我的请求被拒绝了

这是我用来计算散列的代码:

    var
        StringStream: TStringStream;
        MessageDigest: TIdHashMessageDigest5;
        XMLString: string;
    begin
        MessageDigest := TIdHashMessageDigest5.Create;
        StringStream := TStringStream.Create;
        try
            StringStream.WriteString(XMLString);
            HashString := MessageDigest.HashStream(StringStream);

        finally
            StringStream.Free;
            MessageDigest.Free;
        end;
    end;
以下是亚马逊的回应:

    <ErrorResponse xmlns="http://mws.amazonaws.com/doc/2009-01-01/">
        <Error>
            <Type>Sender</Type>
            <Code>ContentMD5DoesNotMatch</Code>
            <Message>the Content-MD5 HTTP header you passed for your feed (H3GnH3X3H3auHZ0mGZ8mD4KvE30mEJauHKD6E3GoDqK) did not match the Content-MD5 we calculated for your feed (fSEMn6SCuSia5YVdz/1NqQ==)</Message>
            <Detail />
        </Error>
        <RequestID>9c3e0b2a-c418-41dc-b733-e55ac01343b1</RequestID>
    </ErrorResponse>
计算base64编码的MD5哈希的正确方法是什么?我的代码有问题吗

提前谢谢,并致以问候

p.

更改此项:

StringStream := TStringStream.Create;
try
  StringStream.WriteString(XMLString);
为此:

StringStream := TStringStream.Create(XMLString);
或者这个:

StringStream := TStringStream.Create;
try
  StringStream.WriteString(XMLString);
  StringStream.Position := 0;
无论哪种方式,也要记住,在XE2中,
String
是unicode,而
TStringStream
TEncoding
-感知的,因此确保在对字符串进行散列之前将其编码为正确的字符集,例如:

StringStream := TStringStream.Create(XMLString, TEncoding.UTF8);
最后,
TIdHash
有一个
HashString()
(和
HashStringAsHex()
)方法,因此您不需要手动处理
TStream

HashString := MessageDigest.HashString(XMLString, IndyUTF8Encoding);

谢谢你的回复。HashString返回一个TArray,我不确定我的转换是否正确。此外,结果字符串应该是base64编码的。下面是代码片段:
HashArray:=MessageDigest.HashString(XMLText,IndyUTF8Encoding);SetString(HashString,PAnsiChar(@HashArray[0]),Length(HashArray));Text编辑。Text:=EncodeBase64(HashString)
EncodeBase64()没有显示作为输入的内容,因此我无法回答转换是否正确。对于大量编辑,我深表歉意,因为我不熟悉注释的格式设置。但是,Indy有自己的base64编码器,通过
TidEncoderMie
类,可以直接编码字节数组,而不需要先将其复制到字符串。