0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MSX BASICでbase64エンコーダを実装

Last updated at Posted at 2023-10-28

はじめに

皆さん、こんにちは。
さて、前回の投稿までで、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コマンドを使用してデコードしました。

image.png

「ABCDEFG」とデコードできましたね。
次はちょっと長めの文字列も試してみましょう。
TeraTermからUTF-8の日本語を無理やり流し込んでみます。前回も使用したじゅげむの一節です。

じゅげむじゅげむ ごこうのすりきれず かいじゃりすいぎょの すいぎょうばつ ふうらいばつ くねるところにすむところ

TeraTeram経由でMSX-BASICでプログラムを実行して、テキストを入力します。TeraTerm上では日本語表示されますが、MSX上はバケバケです。

run
Please Input the text for base64 encoding:? じゅげむじゅげむ ごこうのすりきれず かいじゃりすいぎょの すいぎょうばつ ふうらいばつ くねるところにすむところ
Result:44GY44KF44GS44KA44GY44KF44GS44KA44CA44GU44GT44GG44Gu44GZ44KK44GN44KM44Ga44CA44GL44GE44GY44KD44KK44GZ44GE44GO44KH44Gu44CA44GZ44GE44GO44KH44GG44Gw44Gk44CA44G144GG44KJ44GE44Gw44Gk44CA44GP44Gt44KL44Go44GT44KN44Gr44GZ44KA44Go44GT44KN
Ok

結果がでましたね。出力されたテキストが正しくbase64エンコードできているか。さきほどと同様にWSL上でbase64コマンドで確認してみます。

image.png

じゅげむ・・、いけてそうですね。

最後に

今回はbase64エンコーダを実装しました。ファイル受信する際にTeraTermを経由するのであればbase64エンコーダは要らないのではという考えもよぎるのですが、base64エンコードして転送する方針で実装すすめたいと思います。

要らないのでは!

現場からは以上です!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?