HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
1216
knms360バイトとは?bsaveで32バイトキッチリで保存する方法2解決


knms360

リンク

2019/12/16(Mon) 01:08:49|NO.89066

初心者です。バイトがよくわかりません。
sdimでは64byte以下を保存できず、dimじゃないと保存できないのもよくわかりません。
それと、
motodata="88888E8888888888888888888888888888888888888888888888888888888883" ;偽装
dim data,4 repeat strlen (motodata) if second=0{ b=strmid(motodata,cnt,1) //1桁目を取り出し、b に代入 wait waittime second=1 } second=second+1 if second=3{ c=strmid(motodata,cnt,1) //1桁目を取り出し、b に代入 second=0 binary=b+c value = int ("$" + binary) ; int関数 wait waittime lpoke data,poketime,value poketime=poketime+1 } loop bsave "hsp-test2.txt",data mes "保存!"
(継ぎ接ぎ文)
これがバッファーオーバーフローとエラーが出ます
一度数値を10進数にしてるため、バイトを超えてしまってるんだと思います
なので、これの修正方法を教えてください。



この記事に返信する


MillkeyStars

リンク

2019/12/16(Mon) 10:13:37|NO.89067

バッファオーバーフローしている原因は、dim data,4 だと思います。
dim data,4 は、int幅(4 バイト) * 4 = 16バイトしかメモリを確保していないのでオーバーフローエラーを引き起こします。
なので、motodata の文字数によって、dim で確保するメモリ量を変更してください。
strlen(motodata) / 4 で計算できます。

また、bsave で明示的に保存データサイズを指定する場合、bsave の第三引数に希望の保存バイト数を指定してください。
bsave "hsp-test2.txt",data では、data(length) = 4 * 4 = 16バイトしか保存できません。

以下にサンプルを用意したので参考にしてみてください。
【16進数文字列保存サンプル】

motodata="00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF" motodata_size = strlen(motodata) //文字列の文字数を代入(いろいろな所で使うので) //保存用 sdim data,motodata_size / 2 //変換先のメモリ repeat motodata_size / 2 //16進数文字列をバイト値に変換するので、元の文字数 / 2 がリピート回数 b = strmid(motodata,cnt*2,2) poke data,cnt,int("$" + b) loop bsave "hsp-test2.txt",data,motodata_size / 2 //motodata の文字数 / 2 が保存バイト数 mes "保存!" //読取用 repeat 32 //上記の保存バイト数が 32 バイトなので 32 です。 v = peek(data,cnt) pos cnt * 20,20 : mes strf("%02X",v) loop mes "完了!"



knms360

リンク

2019/12/16(Mon) 13:40:50|NO.89068

プログラムまで書いて下さってありがとうございます。
bsaveに第三引数があったとは知りませんでした
ありがとうございます



ONION software Copyright 1997-2023(c) All rights reserved.