09-23-2023, 05:25 PM
Try this version @Dav :
I tried to change and simplify the process as much as possible here. From the initial testing, all seems to be working now as it should, without that stray "0" popping up from time to time and biting you in the hiney.
Try it out and let me know if it works as advertised, or not, for you.
Code: (Select All)
_CONTROLCHR OFF
test$ = "abc"
a$ = B256to128$(test$)
b$ = B128to256$(a$)
PRINT test$, a$, b$
PRINT LEN(test$), LEN(a$), LEN(b$)
SLEEP
FOR i = 0 TO 255
t$ = CHR$(i)
PRINT i, t$,
a$ = B256to128(t$)
PRINT a$,
b$ = B128to256(a$)
PRINT b$
IF t$ <> b$ THEN
PRINT "DON'T MATCH!!"
END
END IF
NEXT
PRINT
PRINT "All characters match before and after encoding and decoding."
FUNCTION B256to128$ (text$)
FOR i = 1 TO LEN(text$)
a = ASC(text$, i) ' get the ASCII value of our character
b$ = RIGHT$("00000000" + _BIN$(a), 8) ' convert it to binary
temp$ = temp$ + b$ ' add the binary to a single long string
NEXT
padding$ = STRING$(7 - LEN(temp$) MOD 7, "0")
temp$ = temp$ + padding$ ' add necessay padding to make it suitable for base-128 encoding
FOR i = 1 TO LEN(temp$) STEP 7
c$ = MID$(temp$, i, 7) ' get 7 characters from our 8 byte represention
c = VAL("&B" + c$) ' that's the character value of our base 128-character
temp1$ = temp1$ + CHR$(c + 65) ' add that to our new string
NEXT
B256to128$ = temp1$
END FUNCTION
FUNCTION B128to256$ (text$)
FOR i = 1 TO LEN(text$)
a = ASC(text$, i) - 65
b$ = RIGHT$("0000000" + _BIN$(a), 7)
temp$ = temp$ + b$
NEXT
temp$ = LEFT$(temp$, 8 * INT(LEN(temp$) / 8)) 'remove padding
FOR i = 1 TO LEN(temp$) STEP 8
b$ = "&B" + MID$(temp$, i, 8)
temp1$ = temp1$ + CHR$(VAL(b$))
NEXT
B128to256$ = temp1$
END FUNCTION
I tried to change and simplify the process as much as possible here. From the initial testing, all seems to be working now as it should, without that stray "0" popping up from time to time and biting you in the hiney.
Try it out and let me know if it works as advertised, or not, for you.