Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Integer in 4 Bytes zerlegen?


Heiko - So 15.05.05 15:23
Titel: Integer in 4 Bytes zerlegen?
Wie kann man am besten ein Integerwert in 4 Bytes zerlegen?


uall@ogc - So 15.05.05 15:39


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var i: integer;
begin
  pbyte(integer(@i)+0)^ := 1;
  pbyte(integer(@i)+1)^ := 1;
  pbyte(integer(@i)+2)^ := 1;
  pbyte(integer(@i)+3)^ := 1;
end;


die 4 bytes, ungetestet


delfiphan - So 15.05.05 15:39

1.) Über ein record-

Delphi-Quelltext
1:
case                    

2.) Durch ein normales record oder array und einem (unsafe) typecast
3.) Über absolute deklarierte Variablen.
4.) Mit Shift (shr) & and Operationen
5.) Über Pointers (siehe oben)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
type
 TVariante1 = record
  case byte of
   0: (I: Integer);
   1: (B1,B2,B3,B4: Byte)
 end;
 TVariante2 = array[0..3of Byte;
var
 Variante1: TVariante1;
 Variante2: Integer;
 Variante3I: Integer;
 Variante3B: array[0..3of Byte absolute Variante3I;
 Variante4: Integer;
begin
 Variante1.I := 1234321;
 ShowMessage(Format('%d %d %d %d', [Variante1.B1, Variante1.B2, Variante1.B3, Variante1.B4]));
 Variante2 := 1234321;
 ShowMessage(Format('%d %d %d %d', [TVariante2(Variante2)[0], TVariante2(Variante2)[1], TVariante2(Variante2)[2], TVariante2(Variante2)[3]]));
 Variante3I := 1234321;
 ShowMessage(Format('%d %d %d %d', [Variante3B[0], Variante3B[1], Variante3B[2], Variante3B[3]]));
 Variante4 := 1234321;
 ShowMessage(Format('%d %d %d %d', [Variante4 and $FF, Variante4 shr 8 and $FF, Variante4 shr 16 and $FF, Variante4 shr 24 and $FF]));
end;

Was für dich am besten ist, hängt davon ab, wofür du es brauchst.
Praktisch ist eigentlich nur Variante 2, allenfalls Variante 4 (sicherer und unabhängig von der Endianess).