gpt4 book ai didi

c# - 是否可以将此 Delphi 函数转换为 C# 方法?如何?

转载 作者:太空宇宙 更新时间:2023-11-03 22:34:06 24 4
gpt4 key购买 nike

我一直致力于从 Delphi 到 C# 的转换。这通常不是我要处理的事情。所以,我虚心来到这里寻求帮助。

这是我目前所拥有的:

德尔福代码:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils,
Console in 'Console.pas';

const
CKEY1 = 11111;
CKEY2 = 22222;
function EncryptStr(const s: WideString; Key: word): String;
var
i: integer;
RStr: RawByteString;
RStrB: TBytes Absolute RStr;
begin
Result := '';
RStr := UTF8Encode(s);
for i := 0 to Length(RStr) - 1 do
begin
RStrB[i] := RStrB[i] xor (Key shr 8);
Key := (RStrB[i] + Key) * CKEY1 + CKEY2;
end;
for i := 0 to Length(RStr) - 1 do
begin
Result := Result + IntToHex(RStrB[i], 2);
end;
end;

function DecryptStr(const s: String; Key: word): String;
var
i, tmpKey: integer;
RStr: RawByteString;
RStrB: TBytes Absolute RStr;
tmpStr: string;
begin
tmpStr := UpperCase(s);
SetLength(RStr, Length(tmpStr) div 2);
i := 1;
try
while (i < Length(tmpStr)) do
begin
RStrB[i div 2] := StrToInt('$' + tmpStr[i] + tmpStr[i + 1]);
Inc(i, 2);
end;
except
Result := '';
Exit;
end;
for i := 0 to Length(RStr) - 1 do
begin
tmpKey := RStrB[i];
RStrB[i] := RStrB[i] xor (Key shr 8);
Key := (tmpKey + Key) * CKEY1 + CKEY2;
end;
Result := UTF8Decode(RStr);
end;

var myEncrypted: string;
begin
try
myEncrypted := EncryptStr('TheTestString', 4444);
WriteLn('Encrypted: '+myEncrypted);
ExitCode := 1;
Console.WaitAnyKeyPressed('Press any key to continue ...');
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.

我把它放在这里的部分原因是这段代码起源于这里(不是我的)delphi-simple-string-encryption .

这是我到目前为止所做的尝试:

C#代码:

private const int CKEY1 = 11111;
private const int CKEY2 = 22222;
public static string EncryptAString(string s, int Key)
{
try
{
var encryptedValue = string.Empty;
// Create a UTF-8 encoding.
UTF8Encoding utf8 = new UTF8Encoding();
// Encode the string.
byte[] RStrB = utf8.GetBytes(s);

for (var i = 0; i <= RStrB.Length - 1; i++)
{
RStrB[i] = Convert.ToByte(RStrB[i] ^ (Key >> 8));
Key = (RStrB[i] + Key) * CKEY1 + CKEY2;
//I have a problem right here. See screen shot for values
}
for (var i = 0; i <= RStrB.Length - 1; i++)
{
encryptedValue = encryptedValue + RStrB[i].ToString("X2");
}
return encryptedValue;
}
catch (Exception)
{
throw;
}
}

德尔福 enter image description hereC# enter image description here

C# 代码最终给出了这个错误:错误:

System.OverflowException: Value was either too large or too small for an unsigned byte. at System.Convert.ToByte(Int32 value) at ChronicleConvertText.Program.EncryptAString(String s, Int32 Key) in C:\Users\todd7\source\repos\ChronicleConvertText\ChronicleConvertText\Program.cs:line 70 at ChronicleConvertText.Program.Main(String[] args) in C:\Users\todd7\source\repos\ChronicleConvertText\ChronicleConvertText\Program.cs:line 17

在研究这个过程中,有几件事成为焦点。

  • 在 Delphi 中,我收到此警告:[dcc32 Warning] Project1.dpr(58): W1000 Symbol 'UTF8Decode' is deprecated: 'Use UTF8ToWideString or UTF8ToString'。请记住,这是在使用现有代码。因此,我没有直接研究切换到“UTF8ToWideString 或 UTF8ToString”会产生什么影响。目前我的工作是看看是否可以复制它。
  • 另一个问题是:hazards-of-converting-binary-data-to-a-string .

我怀疑这可能是我对Delphi中的“xor”与C#中的“^”的理解不够。主要问题仍然是这可以做到吗?如何?感谢您的帮助。

最佳答案

您的常量 CKEY1CKEY2 以及参数 Key 具有 int 类型。所以表达

Key = (RStrB[i] + Key) * CKEY1 + CKEY2;

是使用 32 位值计算的。例如:

(4444 + 84) * 11111 + 22222 = 50 332 830

接近您显示的值,不是吗?

Delphi 代码使用 16 位无符号变量和相应的算法,Delphi word 的 C# 等价物是 ushort

关于c# - 是否可以将此 Delphi 函数转换为 C# 方法?如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55957723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com