!十進BASIC で、バイナリー・ファイルを、扱いたい方へ SECOND 2007/11/18 05:06:10 (修正2回) └!ファイル末尾に0Dhがある時、抜けるバグの... SECOND 2007/11/18 09:57:34 (修正1回) └!細部の調整。修正。 SECOND 2007/11/19 06:16:01 └!バイナリーのコピーと照合テスト。 SECOND 2007/11/19 06:17:51 (修正2回)
!十進BASIC で、バイナリー・ファイルを、扱いたい方へ SECOND 2007/11/18 05:06:10 (修正2回) ツリーへ
!十進BASIC で、バイナリー・ファイルを、扱いたい方へ |
返事を書く ノートメニュー |
SECOND <cszcthjjdj> 2007/11/18 05:06:10 ** この記事は2回修正されてます | |
!十進BASIC で、バイナリー・ファイルを、扱いたい方へ
!CHARACTER INPUT を用いる方法が、目次→ファイル→CHARACTER INPUT にありますので、 !LINE INPUT で、読む方法です。(4〜5倍速) !試験用のバイナリーファイルを作る。 !------- LET file$="test.bin" ! パス名を決める。 !ファイル名の前に何も書かない場合、 !起動したファイル( BASIC.EXE、又は ??.BAS) と同じフォルダーに作られます。 !------- write binary OPEN #1: NAME file$ ERASE #1 OPTION CHARACTER BYTE ! 目次→文字列→漢字。目次→ファイル→CHARACTER INPUT FOR w=0 TO BVAL("10F",16) PRINT #1: CHR$( MOD(w,256) ); ! 00h〜0ffhの通しデータ−256+16バイト。 NEXT w CLOSE #1 !試験用のバイナリーファイルを、正しく読めるか確かめる。 !------- ダンプ・リスト OPEN #1: NAME file$, ACCESS INPUT PRINT "Dump list" FOR adr=0 TO BVAL("110",16) STEP 16 CALL readb(16) PRINT right$("000"&BSTR$(adr,16),4);" "; FOR w=1 TO LEN(db$) PRINT " ";right$("0"&BSTR$(ORD( db$(w:w) ),16),2); NEXT w PRINT TAB(56); FOR w=1 TO LEN(db$) IF " "<=db$(w:w) THEN PRINT db$(w:w); ELSE PRINT "."; NEXT w NEXT adr CLOSE #1 !------- read binary SUB readb(cx) ! cx=bytes size OPTION CHARACTER BYTE ! 目次→文字列→漢字。目次→ファイル→CHARACTER INPUT SET #1: ENDOFLINE CHR$(13) ! 目次→ファイル→独自の拡張 LET db$="" DO LET w9=LEN(w9$)-cx IF 0=<w9 THEN LET db$=db$ &left$(w9$,cx) LET w9$=right$(w9$,w9) EXIT SUB END IF LET db$=db$ &w9$ LET w9$="" LET cx=-w9 LINE INPUT #1,IF MISSING THEN EXIT DO :w9$ ! PointerEnd で始めた場合 →EXIT DO →w9$ 不変。 ASK #1: POINTER s9$ ! 目次→ファイル→その他のSET文とASK文。(参照:目次→ファイル→SET POINTER) IF s9$<>"END" THEN LET w9$=w9$ &CHR$(13) LOOP END SUB END ! SET #1: ENDOFLINE で、行末2バイト指定した場合、 ! CHR$(13)&CHR$(10) を指定しても CHR$(13)&CHR$(?) となり、2バイト目は 不明で失われる。 ! CHR$(10)&CHR$(13) を指定しても CHR$(10)&CHR$(?) となり、2バイト目は 不明で失われる。 ! の不都合があります。 ! CHR$(13)、1つを指定すれば、失われても補足できる。 |
└!ファイル末尾に0Dhがある時、抜けるバグの... SECOND 2007/11/18 09:57:34 (修正1回) ツリーへ
Re: !十進BASIC で、バイナリー・ファイルを、扱いたい方へ |
返事を書く ノートメニュー |
SECOND <cszcthjjdj> 2007/11/18 09:57:34 ** この記事は1回修正されてます | |
!ファイル末尾に 0Dh がある時、抜けるバグの修正。
!---------------------------------------------- !十進BASIC で、バイナリー・ファイルを、扱いたい方へ !CHARACTER INPUT を用いる方法が、目次→ファイル→CHARACTER INPUT にありますので、 !LINE INPUT で、読む方法です。(1回のサイズが32KBくらいになると、4〜5倍速さが違う。) !試験用のバイナリーファイルを作る。 !------- LET file$="test.bin" ! パス名を決める。 !ファイル名の前に何も書かない場合、 !起動したファイル( BASIC.EXE、又は ??.BAS) と同じフォルダーに作られます。 !------- write binary OPEN #1: NAME file$ ERASE #1 OPTION CHARACTER BYTE ! 目次→文字列→漢字。目次→ファイル→CHARACTER INPUT FOR w=0 TO BVAL("10D",16) PRINT #1: CHR$( MOD(w,256) ); ! 00h〜0ffhの通しデータ−256+13バイト。 NEXT w CLOSE #1 !試験用のバイナリーファイルを、正しく読めるか確かめる。 !------- ダンプ・リスト OPEN #1: NAME file$, ACCESS INPUT PRINT "Dump list" FOR adr=0 TO BVAL("110",16) STEP 16 CALL readb(16) LET ww$=right$("000"&BSTR$(adr,16),4)&" " FOR w=1 TO LEN(db$) LET ww$=ww$ &" "&right$("0"&BSTR$(ORD( db$(w:w) ),16),2) NEXT w LET ww$=ww$ &REPEAT$(" ",55-LEN(ww$)) FOR w=1 TO LEN(db$) IF " "<=db$(w:w) THEN LET ww$=ww$ &db$(w:w) ELSE LET ww$=ww$ &"." NEXT w PRINT ww$ ! 1行まとめて書く。テキスト画面のピカつき減少、高速。 NEXT adr CLOSE #1 !------- read binary SUB readb(cx) ! cx=bytes size OPTION CHARACTER BYTE ! 目次→文字列→漢字。目次→ファイル→CHARACTER INPUT SET #1: ENDOFLINE CHR$(13) ! 目次→ファイル→独自の拡張 LET db$="" DO LET w9=LEN(w9$)-cx IF 0=<w9 THEN LET db$=db$ &left$(w9$,cx) LET w99=w99+cx LET w9$=right$(w9$,w9) EXIT SUB END IF LET db$=db$ &w9$ LET w99=w99+LEN(w9$) LET w9$="" LET cx=-w9 LINE INPUT #1,IF MISSING THEN EXIT DO :w9$ ! EOFで、空""の場合 →EXIT DO →w9$ 不変。 ASK #1: POINTER s9$ ! 目次→ファイル→その他のSET文とASK文。(参照:目次→ファイル→SET POINTER) IF s9$<>"END" THEN LET w9$=w9$ &CHR$(13) LOOP ASK #1: FILESIZE w9 ! 目次→ファイル→独自の拡張 IF w99+1=w9 THEN LET db$=db$ &CHR$(13) LET w99=0 END SUB END ! SET #1: ENDOFLINE で、行末2バイト指定した場合、 ! CHR$(13)&CHR$(10) を指定しても CHR$(13)&CHR$(?) となり、2バイト目は 不明で失われる。 ! CHR$(10)&CHR$(13) を指定しても CHR$(10)&CHR$(?) となり、2バイト目は 不明で失われる。 ! の不都合があります。 ! CHR$(13)、1つを指定すれば、失われても補足できる。 |
└!細部の調整。修正。 SECOND 2007/11/19 06:16:01 ツリーへ
Re: !ファイル末尾に0Dhがある時、抜けるバグの... |
返事を書く ノートメニュー |
SECOND <cszcthjjdj> 2007/11/19 06:16:01 | |
!細部の調整。修正。
!---------------------------------------------- !十進BASIC で、バイナリー・ファイルを、扱いたい方へ !CHARACTER INPUT を用いる方法が、目次→ファイル→CHARACTER INPUT にありますので、 !LINE INPUT で、読む方法です。(1回のサイズが32KBくらいになると、4〜5倍速さが違う。) !試験用のバイナリーファイルを作る。 !------- LET file$="test.bin" ! パス名を決める。 !ファイル名の前に何も書かない場合、 !起動したファイル( BASIC.EXE、又は ??.BAS) と同じフォルダーに作られます。 !------- write binary OPEN #1: NAME file$ ERASE #1 OPTION CHARACTER BYTE FOR w=0 TO BVAL("10D",16) PRINT #1: CHR$( MOD(w,256) ); ! 00h~0ffh の通しデータ− 256+13 バイト。 NEXT w CLOSE #1 !試験用のバイナリーファイルを、正しく読めるか確かめる。 !------- オープン繰返しテスト OPEN #1: NAME file$, ACCESS INPUT LET w9$="" LET s99=0 CALL readb(20) !各変数にデータ−を残したまま、 CLOSE #1 ! 途中で、終了。 !------- ダンプ・リスト OPEN #1: NAME file$, ACCESS INPUT LET w9$="" LET s99=0 PRINT "Dump list" FOR adr=0 TO BVAL("120",16) STEP 16 CALL readb(16) LET ww$=right$("000"&BSTR$(adr,16),4)&" " FOR w=1 TO LEN(db$) LET ww$=ww$ &" "&right$("0"&BSTR$(ORD( db$(w:w) ),16),2) NEXT w LET ww$=ww$ &REPEAT$(" ",55-LEN(ww$)) FOR w=1 TO LEN(db$) IF " "<=db$(w:w) THEN LET ww$=ww$ &db$(w:w) ELSE LET ww$=ww$ &"." NEXT w PRINT ww$ ! 1行に、まとめてから書く。テキスト画面のピカつき減少、高速。 NEXT adr CLOSE #1 !------- read binary SUB readb(cx) ! cx=bytes size OPTION CHARACTER BYTE SET #1: ENDOFLINE CHR$(13) ASK #1: FILESIZE s9 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 SUB 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 END SUB END |
└!バイナリーのコピーと照合テスト。 SECOND 2007/11/19 06:17:51 (修正2回) ツリーへ
Re: !細部の調整。修正。 |
返事を書く ノートメニュー |
SECOND <cszcthjjdj> 2007/11/19 06:17:51 ** この記事は2回修正されてます | |
!バイナリーのコピーと照合テスト。
!---------------------------------------------- !十進BASIC のヘルプファイル( 154KB バイナリーです。)を、コピーしてみる。 !※ヘルプファイルは、閉じておかないと、読込みの、OPENが、出来ないようです。 LET COPY元$="basic.chm" LET COPY先$="test.chm" LET BAT000$="test.bat" ! 照合するときの作業ファイル !ご注意!ファイル名の前に何も書かない場合、 ! 起動したファイル( BASIC.EXE、又は ??.BAS) と同じフォルダー内に、読み書き。 !------- PRINT "読込み中です。← ";COPY元$ OPEN #1: NAME COPY元$, ACCESS INPUT LET w9$="" LET s99=0 LET A$="" DO CALL readb(100000) ! 8 秒(98SE 500MHz) 2 秒(winXP 1.7GHz) !CALL readCI(100000) ! 66 秒(98SE 500MHz) 38 秒(winXP 1.7GHz) CHRACTER INPUT での読込み。 LET A$=A$&db$ LOOP UNTIL db$="" CLOSE #1 !------- PRINT "書込み中です。→ ";COPY先$ OPEN #1: NAME COPY先$ ERASE #1 PRINT #1:A$; CLOSE #1 PRINT "コピーしました。";COPY元$;" → ";COPY先$ !------- PRINT "DOS で、照合。 FC.exe /b ";COPY元$;" ";COPY先$ OPEN #1: NAME BAT000$ ERASE #1 PRINT #1:"fc/b "+COPY元$+" "+COPY先$ PRINT #1:"pause" CLOSE #1 Execute BAT000$ !------- ! FILE DELETE BAT000$ PRINT "終了。" !------- read binary SUB readCI(cx) ! cx=bytes size OPTION CHARACTER BYTE LET db$="" FOR i=1 TO cx CHARACTER INPUT #1,IF MISSING THEN EXIT SUB :w9$ LET db$=db$ &w9$ NEXT i END SUB !------- read binary SUB readb(cx) ! cx=bytes size OPTION CHARACTER BYTE SET #1: ENDOFLINE CHR$(13) ASK #1: FILESIZE s9 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 SUB 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 END SUB END |