Aufsplitte einer Integer-Variable in 1 Bytes
-
- Beiträge: 188
- Registriert: Fr 18. Jan 2013, 09:29
- OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
- CPU-Target: Celeron
Aufsplitte einer Integer-Variable in 1 Bytes
Hallo zusammen
für eine Serielle Schnittstelle muß ich eine Integer-Variable in zwei Bytes aufspalten, also LSB uns MSB.
Wie mache ich das denn am Besten, ich hab mir den Wolf gesucht und nix gefunden. Gibt es da eine Funktion, oder muß ich das per Teilen und Rest machen?
Gruß Fritz
für eine Serielle Schnittstelle muß ich eine Integer-Variable in zwei Bytes aufspalten, also LSB uns MSB.
Wie mache ich das denn am Besten, ich hab mir den Wolf gesucht und nix gefunden. Gibt es da eine Funktion, oder muß ich das per Teilen und Rest machen?
Gruß Fritz
-
- Beiträge: 129
- Registriert: Sa 25. Mai 2013, 07:43
- OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
- CPU-Target: 32Bit
Re: Aufsplitte einer Integer-Variable in 1 Bytes
Das einfachste wäre vermutlich über einen Record mit varianten Anteil:
Das geht auch in die andere Richtung, die Byts beschreiben und die Speicherstelle i enthält das Ergebnis.
Code: Alles auswählen
type
Tunion = record
Case Integer Of
0: (i: Smallint);
1: (s: array[0..1] of byte);
end;
var
myUnion : Tunion;
iEingabe : Integer = 0;
begin
myUnion.i := iEingabe;
lblErgebnis.Caption := Format ('Die Der Inhalt der Integer: %d.%d',[myUnion.s[1],myUnion.s[0]]);
Vbxler
-------------------------
-------------------------
-
- Beiträge: 206
- Registriert: Di 10. Nov 2009, 18:49
- OS, Lazarus, FPC: macOS, 10.13, lazarus 1.8.x, fpc 3.0.x
- CPU-Target: 32Bit/64bit
Re: Aufsplitte einer Integer-Variable in 1 Bytes
dafür gibt es prinzipiell zwei Varianten: entweder expliziter Code in Pascal oder mittels einer Datenstruktur (varianter Record), bei der der Compiler die Arbeit übernimmt.
1) mittels Code:
2) mittels Datenstruktur (hängt aber vermutlich von der endianess des Prozessors ab):
Grüße - Mischi
1) mittels Code:
Code: Alles auswählen
var
myword: word;
lsb, msb: byte;
begin
myword := 12345;
lsb := myword; (* Das gibt erstaunlicherweise nur bei shortint eine Warnung, aber nicht bei word *)
msb := myword shr 8;
writeln ('myword: ', binStr(myword, 16));
writeln ('lsb: ', ' ', binStr(lsb, 8));
writeln ('msb: ', binStr(msb, 8));
end.
Code: Alles auswählen
var
number: record case integer of
1: (myword : word);
2: (lsb, msb: byte);
end;
begin
number.myword := 12345;
writeln ('number.myword: ', binStr(myword, 16));
writeln ('number.lsb: ', ' ', binStr(lsb, 8));
writeln ('number.msb: ', binStr(msb, 8));
end.
Zuletzt geändert von mischi am Mo 21. Jul 2014, 14:50, insgesamt 1-mal geändert.
MiSchi macht die fink-Pakete
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Aufsplitte einer Integer-Variable in 1 Bytes
z.B.
Integer ist ausser im Turbo Pascal Modus 4-Bytes breit.
Die Lösung von Vbxler ist "endianess" abhängig.
Code: Alles auswählen
int32: integer;
int16: smallint;
b0,b1,b2,b3: byte;
[...]
b0:= int32;
b1:= int32 shr 8;
b2:= int32 shr 16;
b3:= int32 shr 24;
[...]
b0:= lo(int16);
b1:= hi(int16);
end;
Die Lösung von Vbxler ist "endianess" abhängig.
- willi4willi
- Lazarusforum e. V.
- Beiträge: 167
- Registriert: Sa 1. Nov 2008, 18:06
- OS, Lazarus, FPC: Windows, Linux (debian) / Lazarus 3.2 / FPC 3.2.2
- CPU-Target: i386, win64, arm
Re: Aufsplitte einer Integer-Variable in 1 Bytes
Ich hätte es so gemacht:
Ergebnis:
Code: Alles auswählen
program Project1;
var i : integer;
b : array[0..1] of byte absolute i;
begin
i:=123123;
WriteLn('integer=',i:10);
WriteLn('byte=',b[0]:10,b[1]:10);
readln;
end.
Code: Alles auswählen
integer= 123123
byte= 243 224
Viele Grüße
Willi4Willi
------------
Re: Aufsplitte einer Integer-Variable in 1 Bytes
Bleibt die Frage, welche Bytes eigentlich interessieren.
Einen 32bit (4-Byte) Datentypen kann man nicht wirklich mit 2 Bytes abbilden.
Alternativ kann man afaik auch mit
Lo(Lo(int32));
oder
Hi(Lo(int32));
etc. arbeiten.
Einen 32bit (4-Byte) Datentypen kann man nicht wirklich mit 2 Bytes abbilden.
Alternativ kann man afaik auch mit
Lo(Lo(int32));
oder
Hi(Lo(int32));
etc. arbeiten.
-
- Beiträge: 188
- Registriert: Fr 18. Jan 2013, 09:29
- OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
- CPU-Target: Celeron
Re: Aufsplitte einer Integer-Variable in 1 Bytes
Danke Leute, das war erschöpfend, und vor allem, das was ich brauche ist echt easy.
Again what learned.
Gruß Fritz
Again what learned.
Gruß Fritz
-
- Beiträge: 206
- Registriert: Di 10. Nov 2009, 18:49
- OS, Lazarus, FPC: macOS, 10.13, lazarus 1.8.x, fpc 3.0.x
- CPU-Target: 32Bit/64bit
Re: Aufsplitte einer Integer-Variable in 1 Bytes
LOLhaderlump hat geschrieben:Again what learned.
MiSchi macht die fink-Pakete