1 2 Test%=0 : REM 0=my work 1=RTR's 3 IF Test% THEN PRINT "testing RTR's" 4 a$="":Err%=0:T%=TIME 5 6 FOR b=1 TO 4 : T1%=TIME 7 PRINT "test ";b;" stringlen = ";LENa$;" to ";LENa$+1000; 8 FOR a=1 TO 1000 9 a$+=CHR$RND(255) 10 IF Test% THEN 11 b$=FNattach(a$) 12 IF a$<>FN_b64_bin(b$) Err%+=1 13 ELSE 14 b$=FN_bin_b64(a$) 15 IF a$<>FN_b64_bin(b$) Err%+=1 16 ENDIF 17 NEXT a 18 19 b$=a$ 20 FOR a=1 TO 100 21 IF Test% THEN 22 c$=FNattach(b$) 23 b$=FN_b64_bin(c$) 24 ELSE 25 c$=FN_bin_b64(b$) 26 b$=FN_b64_bin(c$) 27 ENDIF 28 NEXT a 29 30 IF a$=b$ THEN 31 PRINT " ok";" time = ";INT((TIME-T1%)/100);" sec" 32 ELSE 33 PRINT " test failed............":Err%+=1 34 ENDIF 35 NEXT b 36 PRINT "number of errors = ";Err%;" time = ";INT((TIME-T%)/60)/100;" min" 37 END 38 39 DEF FN_bin_b64(bin$) 40 LOCAL pad%,b64$,A%,B%,C%,D%,E%,F%,G%,I% 41 I%=LEN(bin$) MOD 3 42 IF I%=1 THEN bin$+=CHR$(0)+CHR$(0):pad%=2 43 IF I%=2 THEN bin$+=CHR$(0):pad%=1 44 FOR I%=1 TO LEN(bin$) STEP 3 45 A%=ASCMID$(bin$,I%,1) 46 B%=ASCMID$(bin$,I%+1,1) 47 C%=ASCMID$(bin$,I%+2,1) 48 D%=A% >> 2 49 E%=(A% AND &03) << 4 OR B% >> 4 50 F%=(B% AND &0F) << 2 OR C% >> 6 51 G%=C% AND &3F 52 b64$+=CHR$(FN_b64(D%))+CHR$(FN_b64(E%)) 53 b64$+=CHR$(FN_b64(F%))+CHR$(FN_b64(G%)) 54 NEXT I% : I%=LEN(b64$) 55 IF pad%=1 THEN MID$(b64$,I%,1)="=" 56 IF pad%=2 THEN MID$(b64$,I%-1,2)="==" 57 =b64$ 58 59 DEF FN_b64(E%) 60 IF E%<26 THEN =E%+65 : REM A-Z 61 IF 25<E% IF E%<52 THEN =E%+71 : REM a-z 62 IF 51<E% IF E%<62 THEN =E%-4 : REM 0-9 63 IF E%=62 THEN =43 : REM + 64 IF E%=63 THEN =47 : REM / 65 =0:REM suppress cross ref warning 66 67 DEF FN_b64_bin(b64$) 68 LOCAL pad%,bin$,A%,B%,C%,D%,E%,F%,G%,I% 69 FOR I%=1 TO LENb64$ STEP 4 70 A%=FN_x64(MID$(b64$,I%,1),pad%) 71 B%=FN_x64(MID$(b64$,I%+1,1),pad%) 72 C%=FN_x64(MID$(b64$,I%+2,1),pad%) 73 D%=FN_x64(MID$(b64$,I%+3,1),pad%) 74 E%=A% << 2 OR B% >> 4 75 F%=(B% AND &0F) << 4 OR C% >> 2 76 G%=(C% AND &03) << 6 OR D% 77 bin$+=CHR$(E%)+CHR$(F%)+CHR$(G%) 78 NEXT I% 79 bin$=LEFT$(bin$,LENbin$-pad%) 80 =bin$ 81 82 DEF FN_x64(e$,RETURN pad%) 83 LOCAL E%:E%=ASC(e$) 84 IF 64<E% IF E%<91 THEN =E%-65 : REM A-Z 85 IF 96<E% IF E%<123 THEN =E%-71 : REM a-z 86 IF 47<E% IF E%<58 THEN =E%+4 : REM 0-9 87 IF E%=43 THEN =62 : REM + 88 IF E%=47 THEN =63 : REM / 89 IF E%=61 THEN pad% +=1 : =0 : REM = padding 90 =0:REM not a b64 file 91 92 DEF FNattach(bin$) 93 LOCAL B$,b64$,L%,A%,D%,I% 94 B$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" 95 L%=LENbin$ MOD 3 96 IF L%=1 bin$+=CHR$0+CHR$0 ELSE IF L%=2 bin$+=CHR$0 97 FOR A%=1 TO LENbin$ STEP 3 98 D%=ASCMID$(bin$,A%,1) << 16 OR ASCMID$(bin$,A%+1,1) << 8 OR ASCMID$(bin$,A%+2,1) 99 FOR I%=1 TO 4 100 b64$+=MID$(B$,(D% >> 18)+1,1) 101 D%=D% << 6 AND &FFFFFF 102 NEXT I% 103 NEXT A% 104 IF L%=1 RIGHT$(b64$,2) = "==" ELSE IF L%=2 RIGHT$(b64$) = "=" 105 =b64$
|
|
|
|