【发布时间】:2009-11-09 09:01:43
【问题描述】:
我现在有以下代码。
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 紧凑框架一起使用。
因此,不允许使用“移动”和使用指针的类似功能(不,我不想要不安全的代码)。
编辑:
我还没有找到更好的方法来做到这一点。给出了一些很好的建议,但它们在 .NET 中都失败了。恐怕我不会再花时间在死路上了。 VCL .NET 已死,恐怕德尔福中的 CF 也已死。所以这对于维护这个项目是必须的。如果有人证明我错了并让代码在 .NET 中编译,我会等待一段时间
编辑2:
解决方案很简单,因为它在大多数情况下都是如此。有人只需要寻找明显的解决方案。我只是不再知道 .NET 中有一个 BitConverter 类
【问题讨论】:
-
我会使用 shl 而不是乘法来使代码更清晰。
-
好主意,它也会更快。你为什么不把它作为答案。现在你的评论是最好的解决方案,或者我应该说改进。
-
如果编译器不知道乘以 2 的幂与移位相同并且只需为您进行转换,则移位只会比乘法快。