Datenkonvertierung in MODULA-2

Mit diesem Modul kann man Bytes in Wörter, Wörter in Langwörter, Cardinals in Integers und natürlich jeweils umgekehrt umwandeln. Da man mit Wörtern oder Langwörtern als Ergebnis aber nicht viel anfangen kann, ist je nach Bedarf die Routine auszuwählen, die einen Cardinal, Integer, Longcard oder Longint zurückgibt.

Das Modul hat sich mir bereits als sehr nützlich erwiesen, da man öfter mal tief in einem Algorithmus steckt und auf einmal zwei nicht kompatible Daten mischen muß. Das Prinzip läßt sich nach Bedarf auch für viele eigene Spezialanwendungen weiterverwenden.

Prinzip

Die Programmierung beruht darauf, daß selbst in Modula, stark unterschiedliche Datentypen mit gleicher Länge alle auf dieselbe Art und Weise abgespeichert werden. Man greift dann mit ADR und POINTER TO, was im Prinzip das Gleiche ist, indirekt auf die Variablen zu.

Funktionsweise

Ein- und Ausgabe stimmen zu 100% bitweise überein, nur die Typen sind halt unterschiedlich. Ausnahme bei Card/Int und Int/Card-Konvertierung: Die Werte werden übernommen, Rückgabe TRUE falls erfolgreich, FALSE falls die Werte nicht in den anderen Typ konvertierbar sind.

Übergabeparameter

Für diejenigen, die es nicht wissen, ein Übergabeparameter vom Typ BYTE ist ein Datum eines beliebigen Typs mit Speicherplatzbedarf von

8 Bit (z.B. CHAR);
WORD analog mit 16 Bit (z.B. CARDINAL, INTEGER) und LONGWORD analog mit 32 Bit (z.B. LONGCARD, LONGINT).

IMPLEMENTATION MODULE BitConversions;

(**************************
DEFINITION MODULE BitConversions;
FROM SYSTEM IMPORT BYTE,WORD,LONGWORD;
EXPORT QUALIFIED BytesToCard,BytesToInt, WordToChars,
                 WordsToLongint,WordsToLongcard, 
                 LongwordToInts,LongwordToCards,
                 IntToCard,CardToInt;

PROCEDURE BytesToCard(HighB,LowB: BYTE): CARDINAL;
PROCEDURE BytesToInt (HighB,LowB: BYTE): INTEGER; 
PROCEDURE WordsToLongcard(HighW,LowW: WORD): LONGCARD;
PROCEDURE WordsToLongint (HighW,LowW: WORD): LONGINT;
PROCEDURE WordToChars(W: WORD; VAR HighC,LowC: CHAR);
PROCEDURE LongwordToCards( LongW : LONGWORD;
                        VAR HighC,LowC: CARDINAL);
PROCEDURE LongwordToInts ( LongW : LONGWORD; VAR HighI,LowI: INTEGER); 
PROCEDURE CardToInt(C:CARDINAL;VAR I:INTEGER) :BOOLEAN;
PROCEDURE IntToCard(I:INTEGER ;VAR C:CARDINAL):BOOLEAN;

END BitConversions.
***************************)


FROM SYSTEM IMPORT BYTE,WORD,LONGWORD,ADR;


(************************************************)

PROCEDURE BytesToCard(HighB,LowB:BYTE): CARDINAL; 
VAR Card  : RECORD High,Low:BYTE END;
    PtCard: POINTER TO CARDINAL;
BEGIN
    Card.High:=HighB; Card.Low:=LowB;
    PtCard :=ADR(Card);
    RETURN PtCard^ 
END BytesToCard;

(************************************************)

PROCEDURE BytesToInt(HighB,LowB: BYTE): INTEGER; 
VAR Int : RECORD High,Low:BYTE END;
    PtInt: POINTER TO INTEGER;
BEGIN
    Int.High:=HighB; Int.Low:=LowB;
    PtInt   :=ADR(Int);
    RETURN PtInt^ 
END BytesToInt;

(************************************************)
PROCEDURE WordsToLongcard(HighW,LowW: WORD): LONGCARD; 
VAR Long  : RECORD High,Low:WORD END;
    PtLong: POINTER TO LONGCARD;
BEGIN
    Long.High:=HighW; Long.Low:=LowW;
    PtLong   :=ADR(Long);
    RETURN PtLong^ 
END WordsToLongcard;

(************************************************)

PROCEDURE WordsToLongint(HighW,LowW: WORD): LONGINT;
VAR Long  : RECORD High,Low:WORD END;
    PtLong: POINTER TO LONGINT;
BEGIN
    Long.High:=HighW; Long.Low:=LowW;
    PtLong   :=ADR(Long);
    RETURN PtLong^ 
END WordsToLongint;

(************************************************)

PROCEDURE WordToChars(W: WORD; VAR HighC,LowC: CHAR);
VAR PtChars: POINTER TO RECORD
                          High,Low: CHAR 
                        END;
BEGIN
    PtChars :=ADR(W);
    HighC:=PtChars^.High; LowC:=PtChars^.Low 
END WordToChars;

(************************************************)

PROCEDURE LongwordToCards(LongW ; LONGWORD;
                        VAR HighC,LowC: CARDINAL); 
VAR PtCards: POINTER TO RECORD
                          High,Low: CARDINAL 
                        END;
BEGIN
    PtCards :=ADR(LongW);
    HighC:=PtCards^.High; LowC:=PtCards^.Low 
END LongwordToCards;

(************************************************)

PROCEDURE LongwordToInts( LongW : LONGWORD;
                         VAR HighI,LowI: INTEGER); 
VAR PtInts: POINTER TO RECORD
                         High,Low: INTEGER 
                       END;
BEGIN
    PtInts :=ADR(LongW);
    HighI  :=PtInts^.High; 
    LowI   :=PtInts^.Low 
END LongwordToInts;

(************************************************)

PROCEDURE IntToCard(I:INTEGER;VAR C:CARDINAL): BOOLEAN;
VAR PtCard: POINTER TO CARDINAL;
BEGIN
    IF I<0 THEN 
        RETURN FALSE 
    ELSE 
        PtCard:=ADR(I);
        C  :=PtCard^;
        RETURN TRUE 
    END (* IF *)
END IntToCard;

(************************************************)

PROCEDURE CardToInt(C:CARDINAL;VAR I:INTEGER): BOOLEAN;
CONST MaxInt=32767;
VAR PtInt: POINTER TO INTEGER;
BEGIN
    IF C>MaxInt THEN 
        RETURN FALSE 
    ELSE 
        PtInt:=ADR(C);
        I :=PtInt^;
        RETURN TRUE 
    END (* IF *)
END CardToInt;

(************************************************)

END BitConversions. (*(C) Marc Esser 1988 !!*)

Marc Esser
Aus: ST-Computer 06 / 1989, Seite 87

Links

Copyright-Bestimmungen: siehe Über diese Seite