'=========================================================================== ' Subject: MBF TO IEEE CONVERSION Date: 10-25-97 (10:49) ' Author: Mark Junker Code: QB, QBasic, PDS ' Origin: mjs@prg.hannover.sgh-net.de Packet: BINARY.ABC '=========================================================================== 'here is a source that converts the MBF (Microsoft Binary Format) to the 'local floating point representation (mostly IEEE). This may be needed by 'some programmers working with old file formats ... ' MBF.BAS - written by Mark Junker (mjs@prg.hannover.sgh-net.de) ' ' Shows how numbers in the MBF format can be decoded. ' QB/PDS source. PB uses must use MKMD$ and MKMS$ DECLARE SUB PrintHexStr (a$) DECLARE SUB PrintMBF (a$) DEFINT A-Z CLS PRINT "nr", "HEX dump : "; "base", "exp", "val" FOR a# = -1 TO 3 STEP .25 'FOR a# = -3 TO 3 ' create MBF number: ' - MKDMBF$() for 8-byte values ' - MKSMBF$() for 4-byte values h$ = MKDMBF$(a#) PRINT a#, CALL PrintHexStr(h$) PRINT ; " : "; CALL PrintMBF(h$) PRINT NEXT END SUB PrintHexStr (a$) ' print HEX dump FOR a = LEN(a$) TO 1 STEP -1 PRINT RIGHT$(HEX$(256 + ASC(MID$(a$, a, 1))), 2); NEXT END SUB SUB PrintMBF (a$) ' split all bytes for data into several bytes DIM b(0 TO 7) isNull = -1 FOR a = 1 TO LEN(a$) b(a - 1) = ASC(MID$(a$, a, 1)) isNull = isNull AND (b(a - 1) = 0) NEXT IF isNull THEN ' special handling for NULL vExp = 0 vBase# = 0 vBaseSign = 0 ELSEIF LEN(a$) = 4 THEN ' single MBF value ' 76543210 76543210 76543210 76543210 ' eeeeeeee smmmmmmm mmmmmmmm mmmmmmmm ' ' e = exponent + 129 ' s = sign of value ' m = mantissa vExp = b(3) vBase# = b(0) + b(1) * 256& + (b(2) AND &H7F) * 65536 vBase# = vBase# / ((256 ^ 3) / 2) IF b(2) AND &H80 THEN vBaseSign = -1 ELSE vBaseSign = 1 vExp = vExp - 129 ELSE ' double MBF value ' 76543210 76543210 76543210 76543210 76543210 76543210 76543210 76543210 ' eeeeeeee smmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm ' ' e = exponent + 129 ' s = sign of value ' m = mantissa vExp = b(7) vBase# = 0 FOR a = 0 TO 5 vBase# = b(a) * 256 ^ a NEXT vBase# = vBase# + (b(6) AND &H7F) * 256 ^ 6 vBase# = vBase# / ((256 ^ 7) / 2) IF b(6) AND &H80 THEN vBaseSign = -1 ELSE vBaseSign = 1 vExp = vExp - 129 END IF if isNull=0 then ' if not NULL then add implied 1 to mantissa vBase# = 1 + vBase# end if PRINT vBase#, vExp, IF isNull THEN result# = 0 ELSE result# = (vBase# * 2 ^ vExp) * vBaseSign END IF PRINT result#; END SUB