Scala 理解传统pascal

Scala 理解传统pascal,scala,pascal,freepascal,legacy-code,Scala,Pascal,Freepascal,Legacy Code,所以我需要理解这段代码在做什么。我不懂pascal或密码学,我很难理解这里到底发生了什么。我需要将SHA1DigestToHex反向工程到scala中,我完全无法学习pascal。你能告诉我这个函数在做什么吗?或者我怎样才能弄明白 Function SHA1DigestToHex (const Digest : T160BitDigest) : String; Begin Result := DigestToHex (Digest, Sizeof (Digest)); End;

所以我需要理解这段代码在做什么。我不懂pascal或密码学,我很难理解这里到底发生了什么。我需要将
SHA1DigestToHex
反向工程到scala中,我完全无法学习pascal。你能告诉我这个函数在做什么吗?或者我怎样才能弄明白

Function SHA1DigestToHex (const Digest : T160BitDigest) : String;
  Begin
    Result := DigestToHex (Digest, Sizeof (Digest));
  End;

Function DigestToHex (const Digest; const Size : Integer) : String;
  Begin
    SetLength (Result, Size * 2);
    DigestToHexBuf (Digest, Size, Pointer (Result)^);
  End;

Procedure DigestToHexBuf (const Digest; const Size : Integer; const Buf);
const s_HexDigitsLower : String [16] = '0123456789abcdef';
var I : Integer;
    P : PChar;
    Q : PByte;
  Begin
    P := @Buf;;
    Assert (Assigned (P), 'Assigned (Buf)');
    Q := @Digest;
    Assert (Assigned (Q), 'Assigned (Digest)');
    For I := 0 to Size - 1 do
      begin
        P^ := s_HexDigitsLower [Q^ shr 4 + 1];
        Inc (P);
        P^ := s_HexDigitsLower [Q^ and 15 + 1];
        Inc (P);
        Inc (Q);
      end;
  End;

更新
它仅将作为
Buf
传入的二进制缓冲区的字节转换为表示
摘要中相同字节的十六进制数字字符串

例如,如果Buf是字节数组(0x12、0x34、0x56),那么后面的摘要将是“123456”

下面是一个更简单的Pascal(Delphi)版本,它可以做同样的事情:

  function SHA1DigestToHex2(const Digest : T160BitDigest) : string;
  const s_HexDigitsLower : array[0..15] of char = '0123456789abcdef';
  var
    i, j: Integer;
  Begin
    SetLength(Result, sizeof(Digest) * 2);
    i := 1;
    j := 0;
    while j < sizeof(Digest) do begin
      Result[i] := s_HexDigitsLower[Digest.Bytes[j] shr 4];
      Result[i+1] := s_HexDigitsLower[Digest.Bytes[j] and $F];
      inc(i, 2);
      inc(j);
    end;
  End;
函数SHA1DigestToHex2(常量摘要:t160bitdesticate):字符串;
常量s_HexDigitsLower:char的数组[0..15]='0123456789abcdef';
变量
i、 j:整数;
开始
设置长度(结果,大小(摘要)*2);
i:=1;
j:=0;
当j
它仅将作为
Buf
传入的二进制缓冲区的字节转换为十六进制数字字符串,表示
摘要中的相同字节

例如,如果Buf是字节数组(0x12、0x34、0x56),那么后面的摘要将是“123456”

下面是一个更简单的Pascal(Delphi)版本,它可以做同样的事情:

  function SHA1DigestToHex2(const Digest : T160BitDigest) : string;
  const s_HexDigitsLower : array[0..15] of char = '0123456789abcdef';
  var
    i, j: Integer;
  Begin
    SetLength(Result, sizeof(Digest) * 2);
    i := 1;
    j := 0;
    while j < sizeof(Digest) do begin
      Result[i] := s_HexDigitsLower[Digest.Bytes[j] shr 4];
      Result[i+1] := s_HexDigitsLower[Digest.Bytes[j] and $F];
      inc(i, 2);
      inc(j);
    end;
  End;
函数SHA1DigestToHex2(常量摘要:t160bitdesticate):字符串;
常量s_HexDigitsLower:char的数组[0..15]='0123456789abcdef';
变量
i、 j:整数;
开始
设置长度(结果,大小(摘要)*2);
i:=1;
j:=0;
当j
对不起,我不明白。它使用二进制缓冲区,并将其转换为十六进制字符串的摘要?知道如何在scala中实现吗?我不明白它是怎么做到的,或者什么是摘要。对不起,我不做Scala。在你的问题上加上
scala
,有相关知识的人可能会看到。或者只是解释更多。您的第一句话看起来像函数是
(Buf,Digest)->String
,但示例看起来像
Bug->String
<虽然code>SHA1DigestToHex
Digest->Sting
,所以我仍然不确定到底发生了什么+1了解pascal哈哈。如果你问我,这段代码很糟糕-它可能是由一个C程序员编写的:)如果你能展示一下
T160BitDigest
是如何定义的,我可以很快为你编写一个更干净的pascal版本,它做同样的事情,并且可能更容易移植。对不起,我不明白。它使用二进制缓冲区,并将其转换为十六进制字符串的摘要?知道如何在scala中实现吗?我不明白它是怎么做到的,或者什么是摘要。对不起,我不做Scala。在你的问题上加上
scala
,有相关知识的人可能会看到。或者只是解释更多。您的第一句话看起来像函数是
(Buf,Digest)->String
,但示例看起来像
Bug->String
<虽然code>SHA1DigestToHex
Digest->Sting
,所以我仍然不确定到底发生了什么+1了解pascal哈哈。如果你问我,这段代码很糟糕-它可能是由一个C程序员编写的:)如果你能展示一下
T160BitDigest
是如何定义的,我可以很快为你编写一个更干净的pascal版本,做同样的事情,这可能会更容易移植。谷歌“字节数组到十六进制字符串”最有可能的解决方案,这不是传统的Pascal,这是完美的当前解决方案Pascal@MarcovandeVoort从应用程序的角度来看,它可能是遗留代码。@Freshyeball:它可能是您的遗留代码,但不是遗留Pascal。标题有误导性。谷歌“字节数组到十六进制字符串”最有可能的解决方案这不是传统的Pascal,这完全是最新的Pascal@MarcovandeVoort从应用程序的角度来看,它可能是遗留代码。@Freshyeball:它可能是您的遗留代码,但不是遗留Pascal。这个标题有误导性。