Yo!
Jak skonwertowac integera do kilku bajtow? z tego co wiem integer to 16 bitow a bajt to 8.wiem ze chodzi o operacje na bitach ale nie wiem ktore. prosze o pomoc.
Integer jest 32 bitowy. Jak ci chodzi o rozbicie jednego integera na 4 Byte to posłuż się operatorami shl i shr.
Lepiej rzutowanie. Np. tak:
type TInteger = record
Bajt1, Bajt2, Bajt3, Bajt4: Byte;
end;
var
I: TInteger;
Liczba: Integer;
B1, B2, B3, B4: Byte;
begin
I := TInteger(Liczba);
B1 := I.Bajt1;
B2 := I.Bajt2;
...
[dopisane - dot. postów poniżej]
Wydawałoby się, że Vogel ma rację, ale pomimo róznych eksperymentów z dyrektywą $A zawsze było wyjustowanie do bajtu w tym przypadku. Być może wyjustowanie działa jedynie przy polach różnego typu.
Co do wyciągania poszczególnych bitów to należy skorzystać z maskowania (and oraz przesunięcia bitowe). Niestety Delphi nie umożliwia stosowania pól bitowych.
Prędzej:
type TInteger = packed record
Bajt1, Bajt2, Bajt3, Bajt4: Byte;
end;
Tak mi się wydaje...
Ja się podłączę do pytania: jak wyciągnąć poszczególne bity z bajtu?
[...] jak wyciągnąć poszczególne bity z bajtu?
Jest to pokazane w BMP-Hide (w kodach źródłowych) i jescze w unicie bits.pas (też w kodach źródłowych)
Vogel i Dryobates:
mozna też uzyć gotowego (w SysUtils) rekordu Int64Rec
type Int64Rec = packed record
case Integer of
0: (Lo, Hi: Cardinal);
1: (Cardinals: array [0..1] of Cardinal);
2: (Words: array [0..3] of Word);
3: (Bytes: array [0..7] of Byte);
end;
Vogel i Dryobates:
mozna też uzyć gotowego (w SysUtils) rekordu Int64Rec
...
Nie tak całkiem. Pytanie dotyczyło typu Integer, który jak wspomniano w aktualnej implementacji Delphi (od D2) jest 32-bitową liczba. Int64Rec, jak widać to aż 64 bity. Wobec tego rzutując, mamy nadmiar. Teoretycznie można skorzystać z tego co jest, ale w niektórych skrajnychprzypadkach nasz rekord mógłby zachaczyć o inne dane i przez przypadek możnaby zmienić nie to co trzeba.
Miałem na myśli coś w stylu:
var
A:Int64Rec;
TestowanyInteger: Integer;
begin
A.Cardinals(0):=TestowanyInteger;
lub
A.Lo:=TestowanyInteger;
I teraz czytamy A.Bytes[0], [1], [2], [3]