将字节转换为红衣主教的最佳方法是什么,反之亦然

时间:2009-11-09 09:01:44

标签: .net delphi byte

我现在有以下代码。

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类

5 个答案:

答案 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;
相关问题