内存中的字节顺序与网络传输的字节顺序是不一样的,用名词说就是大端存储和小端存储的区别,有时候就需要转换。
Delphi7不支持inline内联函数,可以把inline去掉。
function Swap16(const Value: Word): Word; inline;
begin
Result := Swap(Value);
end;
function Swap32(const Value: LongWord): LongWord; inline;
begin
Result := Swap(Word(Value)) shl 16 + Swap(Word(Value shr 16));
end;
function Swap64(const Value: Int64): Int64;
{$IFDEF WIN32}
asm
mov edx, [ebp + $08]
mov eax, [ebp + $0c]
bswap edx
bswap eax
{$ELSE}
{$IFDEF WIN64}
asm
mov rax, rcx
bswap rax
{$ELSE}
begin
Result := Swap32(LongWord(Value));
Result := (Result shl 32) or Swap32(LongWord(Value shr 32));
{$ENDIF}
{$ENDIF}
end;
function SwapFloat(const Value: Single): Single; overload; inline;
var
R: LongWord absolute Result;
V: LongWord absolute Value;
begin
R := Swap32(V);
end;
function SwapFloat(const Value: Double): Double; overload; inline;
var
R: Int64 absolute Result;
V: Int64 absolute Value;
begin
R := Swap64(V);
end;
以上转载自:https://www.cnblogs.com/yangyxd/articles/5766850.html
另外在贴一个十六进制字符串的大小端序交换函数,实现"5A374238424B4342"==>>"42434B423842375A"
function SwapHexString(Value: string): string;
var
TempPchar: Pchar;
i: integer;
Str: string;
begin
//将字符串 Char数组化
TempPchar := Pchar(Value);
i := 0;
Str := '';
while i < length(TempPchar) do
begin
Str := TempPchar[i] + TempPchar[i + 1] + Str;
i := i + 2;
end;
result := Str;
end;
标签:function,begin,end,LongWord,Delphi,交换,Value,Result,低字节
From: https://www.cnblogs.com/YXGust/p/16622934.html