我现在有以下代码。
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和Unicode版本的Delphi以及Delphi 2006中的.NET和.NET紧凑框架一起使用。
所以不允许使用“Move”和类似的使用指针的函数(不,我不想要不安全的代码)。
修改:
我还没有找到更好的方法来做到这一点。给出了一些很好的建议,但它们都在.NET中失败了。恐怕我不会再花时间在死路上了。 VCL .NET已经死了,我担心delphi中的CF也是如此。所以这将有助于维护这个项目。如果有人证明我错了并获得在.NET中编译的代码
,我会等待编辑2:
解决方案很简单,因为在大多数情况下。有人只需要寻找明显的解决方案。我只是不知道.NET中有一个BitConverter类
答案 0 :(得分:2)
在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;
答案 1 :(得分:1)
RESP。
结果:= TByte4(数据);
和 结果:=基数(数据)
虽然这是不一样的(你或多或少地实现了一个小端函数的宿主,然后再回到上面)。
或者,有联合技巧:
type
TSomeRecord = packed record
case boolean of
true : (data4:TByte4);
false :(dateabyte:cardinal);
end;
但我认为.NET也会对此进行调查。
答案 2 :(得分:1)
好的,这有点快......
不要忘记关闭范围检查!
function CardinalToBytes(const Data: Cardinal): TByte4;
begin
Result[0] := Data shr 24;
Result[1] := Data shr 16;
Result[2] := Data shr 8;
Result[3] := Data;
end;
答案 3 :(得分:1)
一种方法是使用案例记录:
type
TTestRecord = record
case Cardinal of
0: (Card: Cardinal);
1: (Arr: array[0..3] of Byte);
end;
var
TR: TTestRecord;
begin
TR.Arr[0] := 0;
TR.Arr[1] := 1;
TR.Arr[2] := 2;
TR.Arr[3] := 3;
TR.Card := 0;
答案 4 :(得分:0)
你没有说没有助记符,所以......
type
TByte4 = packed array[0..3] of Byte; // 32-bit
function CardinalToBytes(const Data: Cardinal): TByte4;
asm
bswap eax
end;
function BytesToCardinal(const Data: TByte4): Cardinal;
asm
bswap eax
end;