はじめに
皆さん、こんにちは。
さて、前回の投稿までで、MSX BASICにコンソール経由でファイルを転送するスクリプトを実装しました。
ファイル送信が実装したら、やはり受信も実装しないとねということで、まずはMSX-BASICでbase64エンコーダを実装します。
環境
MSX:MSX0Stack
クライアントPC:Windows+WSL,TeraTerm
エンコーダ実装
以下実装コードです。
10 DEFINT A-Z:DIM I$, O$, B$:CLEAR 1000
20 INPUT "Please Input the text for base64 encoding:"; I$
30 GOSUB 100'CALL B64E(I$, O$, B$)
40 PRINT "Result:"; O$
50 END
100 'B64E(I$, O$, B$)
110 DIM B(3), OB(4)
120 DIM T$, C$
130 LET O$ = ""
140 LET B$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
150 FOR I = 1 TO LEN(I$) STEP 3
160 T$ = MID$(I$, I, 1)
170 IF LEN(I$) >= I + 1 THEN T$ = T$ + MID$(I$, I + 1, 1)
180 IF LEN(I$) >= I + 2 THEN T$ = T$ + MID$(I$, I + 2, 1)
190 FOR J = 1 TO 3
200 B(J) = 0:
210 NEXT J
220 FOR J = 1 TO LEN(T$)
230 B(J) = ASC(MID$(T$, J, 1))
240 NEXT J
250 OB(1) = B(1) \ 4
260 OB(2) = (B(1) AND 3) * 16 + B(2) \ 16
270 OB(3) = (B(2) AND 15) * 4 + B(3) \ 64
280 OB(4) = B(3) AND 63
290 FOR J = 1 TO 4
300 IF J >= 3 AND LEN(T$) = 1 THEN O$ = O$ + "=" ELSE IF J = 4 AND LEN(T$) = 2 THEN O$ = O$ + "=" ELSE O$ = O$ + MID$(B$, OB(J) + 1, 1)
330 NEXT J
340 NEXT I
350 RETURN
実行結果
では、TeraTermでBASICソースをコピペして実行しましょう。エンコード文字列は「ABCDEFG」です。
run
Please Input the text for base64 encoding:? ABCDEFG
Syntax error in 180
Ok
はい、エラーです。180行をみてみましょう。
list 180
180 IF LEN(>= I + 2 THEN T$ = T$ + MID$(I$, I + 2, 1)
たまに転送時に文字が書けることがありますので、ソースコピペ後チェックサムかけるようなことが必要でしょうね…。
180 IF LEN(I$) >= I + 2 THEN T$ = T$ + MID$(I$, I + 2, 1)
180行目を再度コピペ入力後、気を取り直して実行します。
run
Please Input the text for base64 encoding:? ABCDEFG
Result:QUJDREVGRw==
Ok
結果がでましたね。「QUJDREVGRw==」です。さて、これをbase64デコードして正常動作の確認を行います。今回はWSL上のbase64コマンドを使用してデコードしました。
「ABCDEFG」とデコードできましたね。
次はちょっと長めの文字列も試してみましょう。
TeraTermからUTF-8の日本語を無理やり流し込んでみます。前回も使用したじゅげむの一節です。
じゅげむじゅげむ ごこうのすりきれず かいじゃりすいぎょの すいぎょうばつ ふうらいばつ くねるところにすむところ
TeraTeram経由でMSX-BASICでプログラムを実行して、テキストを入力します。TeraTerm上では日本語表示されますが、MSX上はバケバケです。
run
Please Input the text for base64 encoding:? じゅげむじゅげむ ごこうのすりきれず かいじゃりすいぎょの すいぎょうばつ ふうらいばつ くねるところにすむところ
Result:44GY44KF44GS44KA44GY44KF44GS44KA44CA44GU44GT44GG44Gu44GZ44KK44GN44KM44Ga44CA44GL44GE44GY44KD44KK44GZ44GE44GO44KH44Gu44CA44GZ44GE44GO44KH44GG44Gw44Gk44CA44G144GG44KJ44GE44Gw44Gk44CA44GP44Gt44KL44Go44GT44KN44Gr44GZ44KA44Go44GT44KN
Ok
結果がでましたね。出力されたテキストが正しくbase64エンコードできているか。さきほどと同様にWSL上でbase64コマンドで確認してみます。
じゅげむ・・、いけてそうですね。
最後に
今回はbase64エンコーダを実装しました。ファイル受信する際にTeraTermを経由するのであればbase64エンコーダは要らないのではという考えもよぎるのですが、base64エンコードして転送する方針で実装すすめたいと思います。
要らないのでは!
現場からは以上です!