BASファイル化

 投稿者:しばっち  投稿日:2020年10月 3日(土)19時44分1秒
  前作は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
 

戻る