【问题标题】:Delphi Reverse order of bytesDelphi 反转字节顺序
【发布时间】:2012-10-19 01:36:39
【问题描述】:

我一直在尝试编写一个函数,它接受两个指针(一个输入和一个输出)并将输入中的字节以相反的顺序写入输出。到目前为止,我还无法使其正常工作。

procedure ReverseBytes(Source, Dest: Pointer; Size: Integer);
var
  Index: Integer;
begin
  Move(Pointer(LongInt(Source) + Index)^, Pointer(LongInt(Dest) + (Size - Index))^ , 1);   
end;

任何人都可以提出一个更好的方法来做到这一点。

谢谢。

【问题讨论】:

  • 我敢打赌,您实际上并不想反转字节。您可能想要做的是将主机字节顺序转换为网络字节顺序。所有通讯库中都有用于此的功能。使用它们。它将使您的代码在逻辑上更准确。这就像 div 2 和 shr 1 之间的区别。当您将代码放在大端机器上时,它也会省去头疼的问题。

标签: delphi pointers byte reverse


【解决方案1】:
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;

【讨论】:

  • +1 清晰、快速、高效。另一种更快的模式可能是将字节反转两个(从两端),直到中间。但比其他实现要好得多。
【解决方案2】:
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;

procedure TForm2.Button2Click(Sender: TObject);
var
  s: AnsiString;
  P: Pointer;
begin
  s := #0'testreverse';
  GetMem(P, Length(s));
  ReverseBytes(Pointer(s), P, Length(s));

  ShowMessage(PAnsiChar(P));   // esrevertset
  FreeMem(P);
end;

【讨论】:

  • 我想知道为什么调用整个 Move 例程而不是简单的字节分配 - 教学目的?小修正 - ShowMessage(PAnsiChar(P)) 对于 Unicode 版本的 Delphi 会更好。
  • @MBo - 我的目的是帮助确定原始代码的问题。感谢 PAnsiChar 更正。
  • -1 使用大小为 1 的 Move()!!!!对我来说太可怕了。即使OP使用它。这不是重点。
  • @Arnaud - 的重点。我也在你之前的评论中解释过。有人遇到了这样一个基本的麻烦,最重要的是他要找出问题所在。无论如何,我感谢您的评论..
  • 另一个问题:您最好在这里使用 64 位就绪指针算法,例如使用move(PAnsiChar(Source)[Index],PAnsiChar(Dest)[Size-Index-1],1) - 甚至更好的PAnsiChar(Dest)[Size-Index-1] := PAnsiChar(Source)[Index],而不是不兼容的longint(Source)
猜你喜欢
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
相关资源
最近更新 更多