新しく発言する  EXIT  インデックスへ
!十進BASICで、バイナリー・ファイルを、扱...

  !十進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
PRINT
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


 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。