teacup. [ 掲示板 ] [ 掲示板作成 ] [ 有料掲示板 ] [ ブログ ]


スレッド一覧

  1. スレッドが使えます(2)
  2. Paract BASIC(22)
  3. Amusement_Program(10)
  4. 改修予定のJIS非互換(3)
  5. 複数ページ長編プログラム(新規投稿)(16)
  6. 「十進BASIC第2掲示板」投稿記事リスト(17)
  7. Full BASIC互換ライブラリ(8)
  8. 「十進BASIC掲示板過去ログ」インデックス(トピック)(17)
  9. 人の色覚の数理(14)
  10. 「十進BASIC掲示板過去ログ」インデックス(ツリー)(91)
スレッド一覧(全10)  他のスレッドを探す  スレッド作成

*掲示板をお持ちでない方へ、まずは掲示板を作成しましょう。無料掲示板作成

新着順:16/3476 記事一覧表示 | 《前のページ | 次のページ》

BASE64

 投稿者:しばっち  投稿日:2020年10月 3日(土)19時40分49秒
  通報 返信・引用
  文字列をBASE64エンコード、デコードします。
BASE64では、3バイト24bitずつ取り出してそれを6bitずつ4つに分けます。
6bitつまり2^6で64進文字列に変換します。
文字数が3倍数でない時は"="で埋めます。
3バイトを4文字(バイト)に変換するので増大率は4/3倍になります。
デコードでは4文字ずつ取り出し3バイト24bitの文字列に変換します。

この変換を施すと文字コード(0~255)は全て表示可能文字(印刷可能文字)
となります。

エンコードに使用する文字種を変えた亜種があるようです。
https://ja.wikipedia.org/wiki/Base64


ちなみにBASE16では1バイト8bitを4bitずつ2つに分けます。
4bitつまり2^4で16進文字列に変換します。
これはBSTR$(n,16) BVAL(n$,16)で簡単に変換できます。
1バイトを2文字に変換するので増大率は2倍になります。


BASE64より更に増大率を抑えたBASE85というのもあるようです。
https://ja.wikipedia.org/wiki/Ascii85


OPTION CHARACTER BYTE
DO
   READ IF MISSING THEN EXIT DO:A$
   LET S$=ENCODEBASE64$(A$)
   PRINT "原文  :";A$
   PRINT "ENCODE:";S$
   PRINT "DECODE:";DECODEBASE64$(S$)
   PRINT
LOOP
DATA A
DATA AB
DATA ABC
DATA ABCD
DATA ABCDE
DATA ABCDEFGHIJKLMNOPQRSTUVWXYZ
DATA 0123456789
DATA 十進BASIC
END

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

EXTERNAL  FUNCTION DECODEBASE64$(M$)
OPTION CHARACTER BYTE
LET A$="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
FOR I=0 TO LEN(M$)/4-1
   LET L$=M$(4*I+1:4*I+4)
   IF RIGHT$(L$,2)="==" THEN
      LET N1=POS(A$,L$(1:1))-1
      LET N2=POS(A$,L$(2:2))-1
      LET N=N1*64+N2
      LET N=N/16
      LET DEC$=DEC$&CHR$(MOD(N,256))
   ELSEIF RIGHT$(L$,1)="=" THEN
      LET N1=POS(A$,L$(1:1))-1
      LET N2=POS(A$,L$(2:2))-1
      LET N3=POS(A$,L$(3:3))-1
      LET N=N1*64^2+N2*64+N3
      LET N=N/4
      LET DEC$=DEC$&CHR$(MOD(INT(N/256),256))&CHR$(MOD(N,256))
   ELSE
      LET N1=POS(A$,L$(1:1))-1
      LET N2=POS(A$,L$(2:2))-1
      LET N3=POS(A$,L$(3:3))-1
      LET N4=POS(A$,L$(4:4))-1
      LET N=N1*64^3+N2*64^2+N3*64+N4
      LET DEC$=DEC$&CHR$(MOD(INT(N/256^2),256))&CHR$(MOD(INT(N/256),256))&CHR$(MOD(N,256))
   END IF
NEXT I
LET DECODEBASE64$=DEC$
END FUNCTION
 
 
》記事一覧表示

新着順:16/3476 《前のページ | 次のページ》
/3476