Integer to byte

0

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.

0

Integer jest 32 bitowy. Jak ci chodzi o rozbicie jednego integera na 4 Byte to posłuż się operatorami shl i shr.

0

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.

0

Prędzej:

type TInteger = packed record
Bajt1, Bajt2, Bajt3, Bajt4: Byte;
end;

Tak mi się wydaje...

0

Ja się podłączę do pytania: jak wyciągnąć poszczególne bity z bajtu?

0

[...] 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)

0

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;

0

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.

0

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]

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0