gpt4 book ai didi

c# - 将 C# 函数移动到 Delphi

转载 作者:太空宇宙 更新时间:2023-11-03 19:52:37 33 4
gpt4 key购买 nike

我在 C# 中有下一个函数,我需要转换为 Delphi。 C# 有 BitConverter 可以轻松完成,但我不知道如何在 Delphi 中完成。

/// Reads a 4-byte floating point value from the current stream 
public override float ReadSingle(float sg)
{
byte[] temp = BitConverter.GetBytes( sg );
Array.Reverse(temp);
float returnVal = BitConverter.ToSingle(temp, 0);
return returnVal;
}

我做了:

procedure ReverseBytes(Source, Dest: Pointer; Size: Integer);
var
Index: Integer;
begin
for Index := 0 to Size - 1 do
Move(Pointer(LongInt(Source) + Index)^,
Pointer(LongInt(Dest) + (Size - Index - 1))^ , 1);
end;
function GetBytes(sg:single):Tbytes;
begin
result:=??????
end;

function ReadSingle(sg:single):single;
var dest,temp:Tbytes;
begin
temp := GetBytes(sg); //How todo ???
ReverseBytes(temp,dest,length(temp));
result:=dest;
end;

最佳答案

您正在尝试将大端表示中的单个 float 转换为小端表示。

这个函数会为你做到这一点:

function ReadSingle(sg:single):single;
begin
ReverseBytes(@sg,@Result,SizeOf(Single));
end;

带有 TSingleHelper 的现代 Delphi 版本可以像这样反转字节:

function ReadSingle(sg:Single):single;
begin
Result.Bytes[0] := sg.Bytes[3];
Result.Bytes[1] := sg.Bytes[2];
Result.Bytes[2] := sg.Bytes[1];
Result.Bytes[3] := sg.Bytes[0];
end;

注意:浮点参数在 fpu 寄存器中传递。将缺陷 float 加载到 fpu 寄存器会触发异常。在更正字节顺序之前,我宁愿避免将传入数据视为 float 。

一个例子:

function ReadSingle(sg:PSingle): Single;
begin
ReverseBytes(sg,@Result,SizeOf(Single));
end;

正如@Rudy 所指出的,ReverseBytes 函数对于 64 位编译器是不正确的。 LongInt() 转换必须在这两个地方替换为 NativeUInt()。然后它适用于 32 位编译器和 64 位编译器。还有系统功能可以使用,ntohl()winsock 库中。


这是 here 的另一个 ReverseBytes 替代方案:

procedure ReverseBytes(Source, Dest: Pointer; Size: Integer);
begin
Dest := PByte( NativeUInt(Dest) + Size - 1);
while (Size > 0) do
begin
PByte(Dest)^ := PByte(Source)^;
Inc(PByte(Source));
Dec(PByte(Dest));
Dec(Size);
end;
end;

关于c# - 将 C# 函数移动到 Delphi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36922744/

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