有关delphi的utf8,sha-1和base64

时间:2022-12-02 23:21:12
C#代码是这样的:
public string Hash(string text)
{
var data = Encoding.UTF8.GetBytes(text);
SHA1 sha = new SHA1CryptoServiceProvider();
var code = sha.ComputeHash(data);

return Convert.ToBase64String(code);
}

text是121122
return是wZ6LpbQl6S2GtHGsAasNJAark7E=

delphi好像没有标准的SHA1的转码函数,base64的找到了,在EncdDecd这个单元里有,我怎么写都写不出.net转码的结果。
delphi已经被我写成这样了,已经完全晕了,请高手帮我看看,我是神马地方搞错了。
procedure TForm1.btn1Click(Sender: TObject);
var
    Context:   TSHA1Context;
    Digest:   TSHA1Digest;
    s:   string;
    sm_in,sm_out: TStringStream;
    buf:TBytes;
begin
    s:=UTF8Encode('121122');
    SHA1Init(Context);
    SHA1Update(Context,@s[1],length(s));
    SHA1Final(Context,Digest);
    SetLength(buf,Length(Digest));
    move(Digest[0],buf[0],Length(Digest));
    //buf:=Digest;
    sm_in:=TStringStream.Create(buf);
    sm_out:=TStringStream.Create;
    EncodeStream(sm_in, sm_out);
    ShowMessage(sm_out.DataString);
end;


谁能帮帮我。。。。

4 个解决方案

#1


sha-1用的是这个帖子里的类,delphi没有标准的sha-1类吗
http://topic.csdn.net/t/20060315/20/4617108.html

#2


delphi官方没有出sha1
可以下载个cnvcl,里面有sha1.pas

#3


我觉得我uft8转码部分可能有点问题。。。

#4


搞定了,感谢cdchq帮忙。cnvcl之前就下了,没仔细研究过。
搞定的代码分享下,base64用的是delphi原本就有的类,sha1用的cnvcl的。
procedure TForm1.btn1Click(Sender: TObject);
var
    Digest:   TSHA1Digest;
    utf8Stream: TStringStream;
    s2,s4:AnsiString;
begin
    utf8Stream:=TStringStream.Create('121122',TEncoding.UTF8);
    Digest:= SHA1Buffer(utf8Stream.Bytes,Length(utf8Stream.Bytes));
    s2:=EncodeBase64(@Digest[0],Length(Digest));
    edt2.Text:= string(s2);
end;

#1


sha-1用的是这个帖子里的类,delphi没有标准的sha-1类吗
http://topic.csdn.net/t/20060315/20/4617108.html

#2


delphi官方没有出sha1
可以下载个cnvcl,里面有sha1.pas

#3


我觉得我uft8转码部分可能有点问题。。。

#4


搞定了,感谢cdchq帮忙。cnvcl之前就下了,没仔细研究过。
搞定的代码分享下,base64用的是delphi原本就有的类,sha1用的cnvcl的。
procedure TForm1.btn1Click(Sender: TObject);
var
    Digest:   TSHA1Digest;
    utf8Stream: TStringStream;
    s2,s4:AnsiString;
begin
    utf8Stream:=TStringStream.Create('121122',TEncoding.UTF8);
    Digest:= SHA1Buffer(utf8Stream.Bytes,Length(utf8Stream.Bytes));
    s2:=EncodeBase64(@Digest[0],Length(Digest));
    edt2.Text:= string(s2);
end;