gpt4 book ai didi

delphi - 将 Cardinal 打包和解包为四个字节

转载 作者:行者123 更新时间:2023-12-03 18:00:59 24 4
gpt4 key购买 nike

我必须将 Cardinal 打包和解包为四个单字节字段(在 Delphi 2010 中)。

我正在对大图像的所有像素执行此操作,因此我需要速度快!

谁能告诉我如何编写这两个函数? (const 和 out 关键字只是为了清楚起见。如果它们干扰内联汇编,那么我可以删除它们。)

procedure FromCardinalToBytes( const aInput: Cardinal;
out aByte1: Byte;
out aByte2: Byte;
out aByte3: Byte;
out aByte4: Byte); inline;

function FromBytesToCardinal( const aByte1: Byte;
const aByte2: Byte;
const aByte3: Byte;
const aByte4: Byte):Cardinal; inline;

最佳答案

我建议不要使用函数,只使用变体记录。

type
TCardinalRec = packed record
case Integer of
0: (Value: Cardinal;);
1: (Bytes: array[0..3] of Byte;);
end;

然后您可以轻松地使用它来获取各个字节。

var
LPixel: TCardinalRec;
...
LPixel.Value := 123455;
//Then read each of the bytes using
B1 := LPixel.Bytes[0];
B2 := LPixel.Bytes[1];
//etc.

如果绝对必要,您可以将其放入一个函数中,但它足够简单,无需担心函数调用的开销。


编辑
为了说明变体记录方法的效率,请考虑以下内容(假设您正在从流中读取图像)。

var
LPixelBuffer: array[0..1023] of TCardinalRec;
...

ImageStream.Read(LPixelBuffer, SizeOf(LPixelBuffer));
for I := Low(LPixelBuffer) to High(LPixelBuffer) do
begin
//Here each byte is accessible by:
LPixelBuffer[I].Bytes[0]
LPixelBuffer[I].Bytes[1]
LPixelBuffer[I].Bytes[2]
LPixelBuffer[I].Bytes[3]
end;

PS:您可以将变体记录中的每个字节显式命名为红色、绿色、蓝色(以及第四个字节的含义),而不是任意通用的字节数组。

关于delphi - 将 Cardinal 打包和解包为四个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5773886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com