Aufsplitte einer Integer-Variable in 1 Bytes

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
haderlump
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

Beitrag von haderlump »

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

Vbxler
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

Beitrag von Vbxler »

Das einfachste wäre vermutlich über einen Record mit varianten Anteil:

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]]);
Das geht auch in die andere Richtung, die Byts beschreiben und die Speicherstelle i enthält das Ergebnis.
Vbxler
-------------------------

mischi
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

Beitrag von mischi »

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:

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.
 
2) mittels Datenstruktur (hängt aber vermutlich von der endianess des Prozessors ab):

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.
 
Grüße - Mischi
Zuletzt geändert von mischi am Mo 21. Jul 2014, 14:50, insgesamt 1-mal geändert.
MiSchi macht die fink-Pakete

mse
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

Beitrag von mse »

z.B.

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;
 
Integer ist ausser im Turbo Pascal Modus 4-Bytes breit.
Die Lösung von Vbxler ist "endianess" abhängig.

Benutzeravatar
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

Beitrag von willi4willi »

Ich hätte es so gemacht:

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.
 
 
Ergebnis:

Code: Alles auswählen

 
integer=    123123
byte=       243       224
 
 

Viele Grüße

Willi4Willi

------------

Benutzeravatar
theo
Beiträge: 10867
Registriert: Mo 11. Sep 2006, 19:01

Re: Aufsplitte einer Integer-Variable in 1 Bytes

Beitrag von theo »

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.

haderlump
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

Beitrag von haderlump »

Danke Leute, das war erschöpfend, und vor allem, das was ich brauche ist echt easy.
Again what learned.

Gruß Fritz

mischi
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

Beitrag von mischi »

haderlump hat geschrieben:Again what learned.
LOL
MiSchi macht die fink-Pakete

Antworten