我现在有以下代码。

type
  TByte4 = array[0..3] of Byte; // 32-bit

function CardinalToBytes(const Data: Cardinal): TByte4;
begin
  Result[0] := (Data shr 24) and 255;
  Result[1] := (Data shr 16) and 255;
  Result[2] := (Data shr 8) and 255;
  Result[3] := Data and 255;
end;

function BytesToCardinal(const Data: TByte4): Cardinal;
begin
  Result := (Data[0] * 16777216) +
            (Data[1] * 65536) +
            (Data[2] * 256) +
             Data[3];
end;


我想知道这是否是最快,最有效的方法(我敢肯定这不是:))。要注意的是,这必须在Delphi 2006下的紧凑框架中工作(甚至不要问)。
我在TEA加密算法中使用它,该算法可与Delphi的Ansi和Unicode版本以及Delphi 2006中的.NET和.NET Compact Framework一起使用。

因此,不允许使用“ Move”和与指针一起使用的类似功能(不,我不想要不安全的代码)。

编辑:

我仍然没有找到更好的方法来做到这一点。给出了一些很好的建议,但是它们都在.NET中失败。恐怕我不会再花更多的时间在一条死路上。 VCL .NET已死,恐怕delphi中的CF也已死。因此,这对于维护该项目必不可少。如果有人证明我做错了并让代码在.NET中编译,我将等待一会儿

编辑2:

在大多数情况下,解决方案很简单。有人只需要寻找明显的解决方案。我只是不再知道.NET中有一个BitConverter类

最佳答案

在Delphi.NET中,使用.NET框架中的BitConverter类进行转换。请参见BitConverter Class (System)

例如:

function CardinalToBytes(const Data: Cardinal): TBytes;
begin
  Result := BitConverter.ToBytes(Data);
end;

function BytesToCardinal(const Data: TBytes): Cardinal;
begin
  Result := BitConverter.ToUInt32(Data, 0);
end;

关于.net - 将Bytes转换为Cardinal的最佳方法是什么,反之亦然,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1699860/

10-11 23:07
查看更多