随笔 - 2146  文章 - 19 评论 - 11846 阅读 - 1267万


//按单字节反转内存的函数
procedure ReverseMemory(P: PByte; Len: Integer); overload;
var
  B: Byte;
  P2: PByte;
begin
  P2 := P;
  Inc(P2, Len - 1);
  while Integer(P) < Integer(P2) do
  begin
    B := P^;
    P^ := P2^;
    P2^ := B;
    Inc(P);
    Dec(P2);
  end;
end;

//按双字节反转内存的函数
procedure ReverseMemory(P: PWord; Len: Integer); overload;
var
  W: Word;
  P2: PWord;
begin
  P2 := P;
  Inc(P2, Len div 2 - 1);
  while Integer(P) < Integer(P2) do
  begin
    W := P^;
    P^ := P2^;
    P2^ := W;
    Inc(P);
    Dec(P2);
  end;
end;

//按四字节反转内存的函数
procedure ReverseMemory(P: PInteger; Len: Integer); overload;
var
  I: Integer;
  P2: PInteger;
begin
  P2 := P;
  Inc(P2, Len div 4 - 1);
  while Integer(P) < Integer(P2) do
  begin
    I := P^;
    P^ := P2^;
    P2^ := I;
    Inc(P);
    Dec(P2);
  end;
end;

//调用测试
procedure TForm1.Button1Click(Sender: TObject);
var
  bs: TBytes;
  i: Integer;
begin
  SetLength(bs, 8);
  for i := 0 to Length(bs) - 1 do bs[i] := i + 49;
  ShowMessage(StringOf(bs)); {12345678}

  for i := 0 to Length(bs) - 1 do bs[i] := i + 49;
  ReverseMemory(PByte(bs), Length(bs));
  ShowMessage(StringOf(bs)); {87654321}

  for i := 0 to Length(bs) - 1 do bs[i] := i + 49;
  ReverseMemory(PWord(bs), Length(bs));
  ShowMessage(StringOf(bs)); {78563412}

  for i := 0 to Length(bs) - 1 do bs[i] := i + 49;
  ReverseMemory(PInteger(bs), Length(bs));
  ShowMessage(StringOf(bs)); {56781234}
end;

posted on   万一  阅读(3129)  评论(9编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
历史上的今天:
2008-11-12 在 Delphi 2009 中, for in 循环都能用在什么地方?
2008-11-12 写在博客一周年
2007-11-12 测试代码
2007-11-12 祝贺我的博客开通!


点击右上角即可分享
微信分享提示