|
前作はBASE16によるものでしたが
今回はBASE64で任意ファイルをBASファイル化します。
#1245
#1246
増大(増加)率は4/3倍です。
このプログラムでバイナリー形式ファイルもこの掲示板に
投稿できるようになります。
あまり大きなファイルは無理ですが、作成したdllやexeファイル
zipファイル等の投稿に利用できます。
FILEREAD$はSECONDさん作成のルーチンを
利用させて頂きました。(CHARACTER INPUT #より高速です)
OPTION CHARACTER BYTE
FILE GETNAME F$,"ファイル|*.*"
IF F$="" THEN STOP
LET DAT$=ENCODEBASE64$(FILEREAD$(F$))
OPEN #2:NAME F$&".bas"
ERASE #2
PRINT #2:"OPTION CHARACTER BYTE"
PRINT #2:"OPEN #1:NAME ";CHR$(34);F$;CHR$(34)
PRINT #2:"DO"
PRINT #2:" READ IF MISSING THEN EXIT DO: X$"
PRINT #2:" LET DEC$=DECODEBASE64$(X$)"
PRINT #2:" PRINT #1:DEC$;"
PRINT #2:"LOOP"
LET SIZE=LEN(DAT$)
FOR I=0 TO INT(SIZE/76)-1
PRINT #2:"DATA ";CHR$(34);DAT$(76*I+1:76*I+76);CHR$(34)
NEXT I
IF MOD(SIZE,76)>0 THEN PRINT #2:"DATA ";CHR$(34);DAT$(76*I+1:SIZE);CHR$(34)
PRINT #2:"CLOSE #1"
PRINT #2:"END"
PRINT #2
PRINT #2:"EXTERNAL FUNCTION DECODEBASE64$(X$)"
PRINT #2:"OPTION CHARACTER BYTE"
PRINT #2:"LET A$=";CHR$(34);"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";CHR$(34)
PRINT #2:"FOR I=0 TO INT(BLEN(X$)/4)-1"
PRINT #2:" LET D$=X$(4*I+1:4*I+4)"
PRINT #2:" LET N=0"
PRINT #2:" FOR J=1 TO 4"
PRINT #2:" LET L=POS(A$,D$(J:J))-1"
PRINT #2:" IF L>=0 THEN LET N=N*64+L ELSE LET N=N/4"
PRINT #2:" NEXT J"
PRINT #2:" LET S$=";CHR$(34);CHR$(34)
PRINT #2:" IF D$(3:4)=";CHR$(34);"==";CHR$(34);" THEN"
PRINT #2:" LET KK=1"
PRINT #2:" ELSEIF D$(4:4)=";CHR$(34);"=";CHR$(34);" THEN"
PRINT #2:" LET KK=2"
PRINT #2:" ELSE"
PRINT #2:" LET KK=3"
PRINT #2:" END IF"
PRINT #2:" FOR K=1 TO KK"
PRINT #2:" LET S$=CHR$(MOD(N,256))&S$"
PRINT #2:" LET N=INT(N/256)"
PRINT #2:" NEXT K"
PRINT #2:" LET DEC$=DEC$&S$"
PRINT #2:"NEXT I"
PRINT #2:"LET DECODEBASE64$=DEC$"
PRINT #2:"END FUNCTION"
CLOSE #2
END
EXTERNAL FUNCTION FILEREAD$(NAME$)
OPTION CHARACTER BYTE
OPEN #1:NAME NAME$,ACCESS INPUT
SET #1: ENDOFLINE CHR$(13)
ASK #1: FILESIZE S9
LET CX=S9 ! cx=bytes size
LET DB$=""
DO
LET W9=LEN(W9$)-CX
IF 0=<W9 THEN
LET DB$=DB$ &LEFT$(W9$,CX)
LET S99=S99+CX
LET W9$=RIGHT$(W9$,W9)
EXIT DO
END IF
LET DB$=DB$ &W9$
LET S99=S99+LEN(W9$)
LET W9$=""
LET CX=-W9
LINE INPUT #1,IF MISSING THEN EXIT DO :W9$
IF S99+LEN(W9$)<S9 THEN LET W9$=W9$ &CHR$(13)
LOOP
CLOSE #1
LET FILEREAD$=DB$(1:S9)
END FUNCTION
EXTERNAL FUNCTION ENCODEBASE64$(A$)
OPTION CHARACTER BYTE
LET S$="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
LET L=MOD(LEN(A$),3)
FOR I=0 TO INT(LEN(A$)/3)-1
LET D$=A$(3*I+1:3*I+3)
LET N=ORD(D$(1:1))*256^2+ORD(D$(2:2))*256+ORD(D$(3:3))
LET N1=MOD(INT(N/64^3),64)+1
LET N2=MOD(INT(N/64^2),64)+1
LET N3=MOD(INT(N/64),64)+1
LET N4=MOD(N,64)+1
LET ENC$=ENC$&S$(N1:N1)&S$(N2:N2)&S$(N3:N3)&S$(N4:N4)
NEXT I
LET D$=A$(3*I+1:LEN(A$))
SELECT CASE L
CASE 0
CASE 2
!'2byte 16bit 123456 781234 567800 4倍して6bitずつ*3つ
LET N=ORD(D$(1:1))*256+ORD(D$(2:2))
LET N=N*4
LET N1=MOD(INT(N/64^2),64)+1
LET N2=MOD(INT(N/64),64)+1
LET N3=MOD(N,64)+1
LET ENC$=ENC$&S$(N1:N1)&S$(N2:N2)&S$(N3:N3)&"="
CASE 1
!'1byte 8bit 123456 780000 16倍して6bitずつ*2つ
LET N=ORD(D$)
LET N=N*16
LET N1=MOD(INT(N/64),64)+1
LET N2=MOD(N,64)+1
LET ENC$=ENC$&S$(N1:N1)&S$(N2:N2)&"=="
END SELECT
LET ENCODEBASE64$=ENC$
END FUNCTION
|
|