home *** CD-ROM | disk | FTP | other *** search
- '* ------------------------------------------------------- *
- '* ZCONV.BAS *
- '* Umwandlung Hex- / Oktal- / Binärzahlen <-> dezimal *
- '* (c) 1989 Florian H. Delonge & TOOLBOX *
- '* ------------------------------------------------------- *
-
- '* Standard für alle Variablen ist INTEGER
-
- DEFINT A-Z
-
- DECLARE FUNCTION HexToInt (hx$)
- DECLARE FUNCTION OctToInt (oc$)
- DECLARE FUNCTION BinToInt (bi$)
- DECLARE FUNCTION BIN$ (dec)
-
- CONST CHex = "$" '* Kennbuchstabe für Hex-,
- CONST COct = "&" '* Oktal und
- CONST CBin = "%" '* Binärschreibweise
-
- PRINT
- PRINT "Hexadezimal/Oktal/Binär <-> Integer"
- PRINT " (c) 1989 F.Delonge & TOOLBOX"
-
- DO
- PRINT
- PRINT "Bitte Zahl ($h, &o, %b, n) oder"
- INPUT "nur <RETURN> für Ende eingeben"; x$
- IF x$ = "" THEN EXIT DO
-
- y$ = LEFT$(x$, 1) '* Kennbuchstaben abtrennen
- z$ = "0" + UCASE$(RIGHT$(x$, LEN(x$) - 1))
-
- '* Sicherheitshalber Null voranstellen
- '* falls nur Kennbuchstabe eingegeben
- '* und Umwandeln in Großbuchstaben
-
- SELECT CASE y$ '* Umrechnen in Dezimalzahl
- CASE CHex
- dec = HexToInt(z$)
- CASE COct
- dec = OctToInt(z$)
- CASE CBin
- dec = BinToInt(z$)
- CASE ELSE
- ldc& = VAL(x$)
- IF ldc& < 32768 THEN
- dec = ldc&
- ELSE '* ggf. Komplementdarstellung
- dec = ldc& - 65536
- END IF
- END SELECT
-
- PRINT '* Ausgabe in allen Darstellungsarten
- PRINT "Hexadezimal: "; HEX$(dec)
- IF dec < 0 THEN '* Dezimalwert mit...
- PRINT "Dezimal : "; dec; " ("; dec + 65536; ")"
-
- ELSE '* oder ohne Komplementdarstellung
- PRINT "Dezimal :"; dec
- END IF
- PRINT "Oktal : "; OCT$(dec)
- PRINT "Binaer : "; BIN$(dec)
-
- LOOP '* ...und wieder von vorn
-
- END
-
- FUNCTION BIN$ (dec) '* dezimal -> binär
-
- o$ = OCT$(dec) '* Umwandeln in Oktaldarstellung
- w$ = ""
- FOR i = 1 TO LEN(o$)
- SELECT CASE MID$(o$, i, 1)
- '* für jede Oktalziffer passende
- CASE "0" '* Bit-Dreierkombination erzeugen
- w$ = w$ + "000"
- CASE "1"
- w$ = w$ + "001"
- CASE "2"
- w$ = w$ + "010"
- CASE "3"
- w$ = w$ + "011"
- CASE "4"
- w$ = w$ + "100"
- CASE "5"
- w$ = w$ + "101"
- CASE "6"
- w$ = w$ + "110"
- CASE "7"
- w$ = w$ + "111"
- END SELECT
- NEXT i
- WHILE LEFT$(w$, 1) = "0" AND LEN(w$) > 1
- w$ = RIGHT$(w$, LEN(w$) - 1)
- '* führende Nullen werden abgetrennt
- WEND
- BIN$ = w$
- END FUNCTION
-
- FUNCTION BinToInt (bi$) '* binär -> dezimal
-
- CONST BitOn = "1" '* gesetztes Bit
- CONST BitOff = "0" '* nicht gesetztes Bit
- dec& = 0
- lng = 0
- DO
- IF lng = LEN(bi$) THEN EXIT DO
- c$ = MID$(bi$, lng + 1, 1)
- IF c$ = BitOn OR c$ = BitOff THEN
- lng = lng + 1
- ELSE
- EXIT DO
- END IF
- LOOP
- FOR i = 1 TO lng '* String zeichenweise verarbeiten
- c$ = MID$(bi$, i, 1)
- IF c$ = BitOn AND (lng - i) < 16 THEN
- msk& = 2 ^ (lng - i) '* passende Bitmaske bestimmen
- dec& = dec& OR msk& '* und Bits in Ergebnis setzen
- END IF
- NEXT i
- IF dec& < 32768 THEN
- BinToInt = dec&
- ELSE
- BinToInt = dec& - 65536
- '* ggf. umwandeln in Komplentdarstellung
- END IF
- END FUNCTION
-
- FUNCTION HexToInt (hx$) '* hex -> Integer
-
- HexToInt = VAL("&H" + hx$)
-
- END FUNCTION
-
- FUNCTION OctToInt (oc$) '* oktal -> Integer
-
- OctToInt = VAL("&O" + oc$)
-
- END FUNCTION
- '* ------------------------------------------------------- *
- '* Ende von ZCONV.BAS *