Delphi BytesToString未给出预期输出

Delphi BytesToString未给出预期输出,delphi,Delphi,Indy函数BytesToString给了我有趣的结果,也就是说,不是我期望的结果 这是我的密码 function String2Hex(S: String): String; var I: Integer; begin Result:= ''; for I := 1 to length (S) do Result:= Result+IntToHex(ord(S[i]),2); end; function SHA1FromString(AString:AnsiString):

Indy
函数
BytesToString
给了我有趣的结果,也就是说,不是我期望的结果

这是我的密码

function String2Hex(S: String): String;
var I: Integer;
begin
  Result:= '';
  for I := 1 to length (S) do
    Result:= Result+IntToHex(ord(S[i]),2);
end;

function SHA1FromString(AString:AnsiString): TidBytes;
var
  SHA1: TIdHashSHA1;
begin
  SHA1 := TIdHashSHA1.Create;
  try
    //Result := SHA1.HashBytes(AString);
    Result := SHA1.HashString(AString, IndyTextEncoding_UTF8)
   // SHA1.HashStringAsHex(UTF8Encode(AString), IndyTextEncoding_UTF8);

  finally
    SHA1.Free;
  end;
end;

function bintoAscii(bin: array of byte): AnsiString;
var i: integer;
begin
  SetLength(Result, Length(bin));
  for i := 0 to Length(bin)-1 do
    Result[1+i] := AnsiChar(bin[i]);
end;

function HashSamsung(passcode: String; salt: Int64):AnsiString;
var
  salted_pass : AnsiString;
  g_digest:AnsiString;
  buf: TidBytes;
  I: Integer;
  step: tIDBytes;
  step2: AnsiString;
  salt_hex: AnsiString;
  a: AnsiString;
begin
  salt_Hex := LowerCase(IntToHex(salt, 2));


  salted_pass := passcode + salt_hex;
  buf := nil;
  step := nil;
  for I := 0 to 1023 do
  begin

    step2 := BytesToString(buf,IndyTextEncoding_UTF8) + IntToStr(i) + salted_pass;

    buf := SHA1FromString(step2);

    showmessage(String2Hex(BytesToString(buf,IndyTextEncoding_UTF8)));
    showmessage(String2Hex(bintoAscii(buf)));

  end;
  // showmessage(String2Hex(bintoAscii(buf) ));
 // Result := String2Hex(bintoAscii(buf));
 //Result := buf;

end;
该函数按原样调用

HashSamsung('0000',988796901418269782)

现在,当代码到达
ShowMessage
调用时,两个消息框上的结果都不同。
BytesToString
消息框的输出为;
fffd2effffd0…..
,来自
bintoascii
消息框的输出为;
ab2ec50e0f…..

第二个结果是我期待的结果。所以我的问题是,为什么
BytesToString
函数会给
bintoascii
函数带来不同的结果?

  • bintoAscii
    函数将字节解释为ANSI编码
  • 使用
    BytesToString
    将字节视为UTF-8编码
因为您使用了不同的文本编码,所以可以预期不同的输出

我不知道你想达到什么目的。然而,您似乎试图将二进制数据存储到字符串变量中,这总是错误的

  • bintoAscii
    函数将字节解释为ANSI编码
  • 使用
    BytesToString
    将字节视为UTF-8编码
因为您使用了不同的文本编码,所以可以预期不同的输出

我不知道你想达到什么目的。然而,您似乎试图将二进制数据存储到字符串变量中,这总是错误的

  • bintoAscii
    函数将字节解释为ANSI编码
  • 使用
    BytesToString
    将字节视为UTF-8编码
因为您使用了不同的文本编码,所以可以预期不同的输出

我不知道你想达到什么目的。然而,您似乎试图将二进制数据存储到字符串变量中,这总是错误的

  • bintoAscii
    函数将字节解释为ANSI编码
  • 使用
    BytesToString
    将字节视为UTF-8编码
因为您使用了不同的文本编码,所以可以预期不同的输出


我不知道你想达到什么目的。然而,您似乎试图将二进制数据存储到字符串变量中,这总是错误的

根据python脚本和中的示例值,下面是一个生成相同输出的Delphi翻译:

function HashSamsung(const Passcode: String; Salt: Int64): String;
var
  salted_pass, step: String;
  buf: TIdBytes;
  I: Integer;
  SHA1: TIdHashSHA1;
begin
  salted_pass := Passcode + LowerCase(IntToHex(Salt, 2));
  SHA1 := TIdHashSHA1.Create;
  try
    for I := 0 to 1023 do
    begin
      step := BytesToStringRaw(buf) + IntToStr(i) + salted_pass;
      buf := SHA1.HashString(step, IndyTextEncoding_8Bit);
    end;
  finally
    SHA1.Free;
  end;
  Result := ToHex(buf);
end;
或者:

function HashSamsung(const Passcode: String; Salt: Int64): String;
var
  salted_pass: TIdBytes;
  buf: TIdBytes;
  I: Integer;
  SHA1: TIdHashSHA1;
begin
  salted_pass := IndyTextEncoding_8Bit.GetBytes(Passcode + LowerCase(IntToHex(Salt, 2)));
  SHA1 := TIdHashSHA1.Create;
  try
    for I := 0 to 1023 do
    begin
      AppendString(buf, IntToStr(i));
      AppendBytes(buf, salted_pass);
      buf := SHA1.HashBytes(buf);
    end;
  finally
    SHA1.Free;
  end;
  Result := ToHex(buf);
end;
无论哪种方式,输出如下:

procedure Test;
begin
  ShowMessage(HashSamsung('1234', 988796901418269782));
end;
DC59AACF2AFCE72E737190323022FB6E2831446


根据python脚本和中的示例值,下面是一个生成相同输出的Delphi翻译:

function HashSamsung(const Passcode: String; Salt: Int64): String;
var
  salted_pass, step: String;
  buf: TIdBytes;
  I: Integer;
  SHA1: TIdHashSHA1;
begin
  salted_pass := Passcode + LowerCase(IntToHex(Salt, 2));
  SHA1 := TIdHashSHA1.Create;
  try
    for I := 0 to 1023 do
    begin
      step := BytesToStringRaw(buf) + IntToStr(i) + salted_pass;
      buf := SHA1.HashString(step, IndyTextEncoding_8Bit);
    end;
  finally
    SHA1.Free;
  end;
  Result := ToHex(buf);
end;
或者:

function HashSamsung(const Passcode: String; Salt: Int64): String;
var
  salted_pass: TIdBytes;
  buf: TIdBytes;
  I: Integer;
  SHA1: TIdHashSHA1;
begin
  salted_pass := IndyTextEncoding_8Bit.GetBytes(Passcode + LowerCase(IntToHex(Salt, 2)));
  SHA1 := TIdHashSHA1.Create;
  try
    for I := 0 to 1023 do
    begin
      AppendString(buf, IntToStr(i));
      AppendBytes(buf, salted_pass);
      buf := SHA1.HashBytes(buf);
    end;
  finally
    SHA1.Free;
  end;
  Result := ToHex(buf);
end;
无论哪种方式,输出如下:

procedure Test;
begin
  ShowMessage(HashSamsung('1234', 988796901418269782));
end;
DC59AACF2AFCE72E737190323022FB6E2831446


根据python脚本和中的示例值,下面是一个生成相同输出的Delphi翻译:

function HashSamsung(const Passcode: String; Salt: Int64): String;
var
  salted_pass, step: String;
  buf: TIdBytes;
  I: Integer;
  SHA1: TIdHashSHA1;
begin
  salted_pass := Passcode + LowerCase(IntToHex(Salt, 2));
  SHA1 := TIdHashSHA1.Create;
  try
    for I := 0 to 1023 do
    begin
      step := BytesToStringRaw(buf) + IntToStr(i) + salted_pass;
      buf := SHA1.HashString(step, IndyTextEncoding_8Bit);
    end;
  finally
    SHA1.Free;
  end;
  Result := ToHex(buf);
end;
或者:

function HashSamsung(const Passcode: String; Salt: Int64): String;
var
  salted_pass: TIdBytes;
  buf: TIdBytes;
  I: Integer;
  SHA1: TIdHashSHA1;
begin
  salted_pass := IndyTextEncoding_8Bit.GetBytes(Passcode + LowerCase(IntToHex(Salt, 2)));
  SHA1 := TIdHashSHA1.Create;
  try
    for I := 0 to 1023 do
    begin
      AppendString(buf, IntToStr(i));
      AppendBytes(buf, salted_pass);
      buf := SHA1.HashBytes(buf);
    end;
  finally
    SHA1.Free;
  end;
  Result := ToHex(buf);
end;
无论哪种方式,输出如下:

procedure Test;
begin
  ShowMessage(HashSamsung('1234', 988796901418269782));
end;
DC59AACF2AFCE72E737190323022FB6E2831446


根据python脚本和中的示例值,下面是一个生成相同输出的Delphi翻译:

function HashSamsung(const Passcode: String; Salt: Int64): String;
var
  salted_pass, step: String;
  buf: TIdBytes;
  I: Integer;
  SHA1: TIdHashSHA1;
begin
  salted_pass := Passcode + LowerCase(IntToHex(Salt, 2));
  SHA1 := TIdHashSHA1.Create;
  try
    for I := 0 to 1023 do
    begin
      step := BytesToStringRaw(buf) + IntToStr(i) + salted_pass;
      buf := SHA1.HashString(step, IndyTextEncoding_8Bit);
    end;
  finally
    SHA1.Free;
  end;
  Result := ToHex(buf);
end;
或者:

function HashSamsung(const Passcode: String; Salt: Int64): String;
var
  salted_pass: TIdBytes;
  buf: TIdBytes;
  I: Integer;
  SHA1: TIdHashSHA1;
begin
  salted_pass := IndyTextEncoding_8Bit.GetBytes(Passcode + LowerCase(IntToHex(Salt, 2)));
  SHA1 := TIdHashSHA1.Create;
  try
    for I := 0 to 1023 do
    begin
      AppendString(buf, IntToStr(i));
      AppendBytes(buf, salted_pass);
      buf := SHA1.HashBytes(buf);
    end;
  finally
    SHA1.Free;
  end;
  Result := ToHex(buf);
end;
无论哪种方式,输出如下:

procedure Test;
begin
  ShowMessage(HashSamsung('1234', 988796901418269782));
end;
DC59AACF2AFCE72E737190323022FB6E2831446


那么如何通过testostring使
使用ANSI编码呢?我想。看起来很像你做错了。你不应该把二进制数据放入字符串中。除非你出于某种原因想读取二进制数据——我还没有遇到或认识能这样做的人。@Jerry,这不是重点。二进制数据属于字节数组。字符串保存文本。@David是的,这也是我的观点。你不能读取二进制文件,为什么要把它转换成文本呢?那么我如何通过testostring使
使用ANSI编码呢?我想。看起来很像你做错了。你不应该把二进制数据放入字符串中。除非你出于某种原因想读取二进制数据——我还没有遇到或认识能这样做的人。@Jerry,这不是重点。二进制数据属于字节数组。字符串保存文本。@David是的,这也是我的观点。你不能读取二进制文件,为什么要把它转换成文本呢?那么我如何通过testostring使
使用ANSI编码呢?我想。看起来很像你做错了。你不应该把二进制数据放入字符串中。除非你出于某种原因想读取二进制数据——我还没有遇到或认识能这样做的人。@Jerry,这不是重点。二进制数据属于字节数组。字符串保存文本。@David是的,这也是我的观点。你不能读取二进制文件,为什么要把它转换成文本呢?那么我如何通过testostring使
使用ANSI编码呢?我想。看起来很像你做错了。你不应该把二进制数据放入字符串中。除非你出于某种原因想读取二进制数据——我还没有遇到或认识能这样做的人。@Jerry,这不是重点。二进制数据属于字节数组。字符串保存文本。@David是的,这也是我的观点。你不能读二进制文件,为什么要把它转换成文本呢?