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


HSPTV!掲示板


未解決 解決 停止 削除要請

2026
0310
naya「hsp3dish.js(HSP3.7)用文字列データ読み書きモジュール」を作成しました!7解決


naya

リンク

2026/3/10(Tue) 20:39:33|NO.104809

みなさんこんにちは!

hsp3dish.js(HSP3.7)で文字列の読み書きを可能にする簡易モジュールを作ってみました。
任意の名前をつけて文字列データを簡単に読み書きする事が出来ます。
データの有無をチェックする機能も搭載しました。

利用規約は特にありません。どうぞご自由にどんどん使っていただけたらと思います。

最後に参考元の情報を公開してくださいましたbuhio様に心から感謝申し上げます。


#include "hsp3dish.as" ; ; hsp3dish.js(HSP3.7)用変数データ読み書きモジュール v1.0 ; 作成者:naya ; 原案:参考元:buhio様 ; 作成日:2026/3/10 ; #module "local_storage_mod" ; ; check_item(データの有無をチェックする) ; ; check_item pfn ; ; pfn=チェックするデータ名(文字列) ; ; stat(戻り値)=0(データが存在する),-1(データが存在しない) ; #deffunc check_item str pfn mref stt, 64 sdim strbuf, 1024 ptr = varptr(strbuf) exec {"const ptr = "} + ptr + {"; const str = localStorage.getItem('"} + pfn + {"'); if (str != null) { stringToUTF8Array('0', Module.HEAP8, ptr, 1024); }else{ stringToUTF8Array('-1', Module.HEAP8, ptr, 1024)}"} stt=int(strbuf) return ; ; get_item(データを読み出す) ; ; get_item pfn, vdata ; ; pfn=チェックするデータ名(文字列) ; vdata=取得したデータを入れる変数(変数) ; ; stat(戻り値)=1-?(読みだしたデータの文字数),-1(読み込みに失敗) ; #deffunc get_item str pfn, var vdata mref stt, 64 check_item pfn if (stat!=-1){ sdim strbuf, 1024 ptr = varptr(strbuf) exec {"const ptr = "} + ptr + {"; const str = localStorage.getItem('"} + pfn + {"'); if (str != null) { stringToUTF8Array(str, Module.HEAP8, ptr, 1024); }else{ stringToUTF8Array(str, Module.HEAP8, ptr, 1024)}"} vdata=strbuf stt=strlen(vdata) } else { vdata="" stt=-1 } return ; ; set_item(データを書き込む) ; ; set_item pfn, sdata ; ; pfn=チェックするデータ名(文字列) ; sdata=保存する文字列データ(文字列) ; #deffunc set_item str pfn, str sdata mref stt, 64 exec "localStorage.setItem('" + pfn + "','" + sdata + "'); stt=0 return #global ;以下サンプルスクリプト /* title "LocalStorageTest" sdim txt, 1024 ; 文字列変数 iname="test" ; データの名前 check_item iname ; データの有無をチェック if (stat == -1) { set_item iname, "AAAAAA" ; データの保存 } get_item iname, txt ; データの読み出し st=stat ;結果の表示ループ repeat stick key if key!=0 : end redraw 0 pos 0, 0 mes "vdata=" + txt mes "stat=" + st redraw 1 await 16 loop */



この記事に返信する


naya

リンク

2026/3/10(Tue) 20:47:40|NO.104810

すみません。
説明不足かもしれませんので、補足情報を。

本モジュールはhsp3dish.js製のブラウザゲーム等で文字列データの保存、読み出しを可能にするモジュールとなります。
一度保存した文字列データはブラウザを閉じた後も維持されます。



zakki

リンク

2026/3/11(Wed) 11:00:17|NO.104812

自分専用なら大丈夫ですが、ライブラリ的にはexec前にエスケープかけたり16進数とかbase64とかに変換するほうがよさそうです。
ユーザーの自由入力欄無ければ実害は無いとは思いますが。

set_item iname, "test'); console.log('TEST";" ;



naya

リンク

2026/3/11(Wed) 18:20:19|NO.104813

zakkiさん、アドバイスをありがとうございます。

コンパクトにブラウザアプリでセーブとロードが出来るようにと作成しましたが、
文字列の内容によって不具合や不都合が出るのは少し問題ですよね…。

base64への変換等、取り扱う文字列はユーザー側で工夫していただけるとありがたいです。



naya

リンク

2026/3/11(Wed) 18:39:43|NO.104814

ああ、任意のコードが実行できてしまうのですね。
それは、問題ですね…。



naya

リンク

2026/3/11(Wed) 20:04:57|NO.104815

取り急ぎ、モジュール内での文字列の16進文字列への変換に対応しました。
一応、これでコードの実行は回避できると思われます。

#include "hsp3dish.as" ; ; hsp3dish.js(HSP3.7)用変数データ読み書きモジュール v1.1 ; 作成者:naya ; 原案・参考元:buhio様 ; 作成日:2026/3/10 ; ; 更新情報 ; (26/3/11) v1.1 文字列の16進文字列への変換機能を追加 ; #module "naya_lsmod" ; ; strtohex(文字列を16進文字列に変換) ; ; strtohex(txt) ; ; txt=変換する文字列(文字列) ; ; (戻り値)=16進文字列 ; #defcfunc strtohex str txt sdim intxt, strlen(txt) intxt=txt intxt=strmid(intxt, 0, 1024) sdim outtxt, strlen(intxt)*2 hextbl="0123456789ABCDEF" repeat strlen(intxt) a=peek(intxt, cnt) outtxt+=strmid(hextbl, a/16, 1) + strmid(hextbl, a\16, 1) loop return outtxt ; ; hextostr(16進文字列を文字列に変換) ; ; hextostr(txt) ; ; txt=変換する16進文字列(文字列) ; ; (戻り値)=文字列 ; #defcfunc hextostr str txt sdim intxt, strlen(txt) intxt=txt intxt=strmid(intxt, 0, 2048) sdim outtxt, strlen(intxt)/2 repeat strlen(intxt)/2 a="$"+strmid(intxt, (cnt*2), 1) + strmid(intxt, (cnt*2)+1, 1) poke outtxt, cnt, 0+a loop return outtxt ; ; check_item(データの有無をチェックする) ; ; check_item pfn ; ; pfn=チェックするデータ名(文字列) ; ; stat(戻り値)=0(データが存在する),-1(データが存在しない) ; #deffunc check_item str pfn mref stt, 64 sdim strbuf, 1024 ptr = varptr(strbuf) exec {"const ptr = "} + ptr + {"; const str = localStorage.getItem('"} + pfn + {"'); if (str != null) { stringToUTF8Array('0', Module.HEAP8, ptr, 16); }else{ stringToUTF8Array('-1', Module.HEAP8, ptr, 16)}"} stt=int(strbuf) return ; ; get_item(データを読み出す) ; ; get_item pfn, vdata ; ; pfn=チェックするデータ名(文字列) ; vdata=取得したデータを入れる変数(変数) ; ; stat(戻り値)=1-?(読みだしたデータの文字数),-1(読み込みに失敗) ; #deffunc get_item str pfn, var vdata mref stt, 64 check_item pfn if (stat!=-1){ sdim strbuf, 2048 ptr = varptr(strbuf) exec {"const ptr = "} + ptr + {"; const str = localStorage.getItem('"} + pfn + {"'); if (str != null) { stringToUTF8Array(str, Module.HEAP8, ptr, 2048); }else{ stringToUTF8Array(str, Module.HEAP8, ptr, 2048)}"} vdata=hextostr(strbuf) stt=strlen(vdata) } else { vdata="" stt=-1 } return ; ; set_item(データを書き込む) ; ; set_item pfn, sdata ; ; pfn=チェックするデータ名(文字列) ; sdata=保存する文字列データ(文字列) ; #deffunc set_item str pfn, str sdata mref stt, 64 exec "localStorage.setItem('" + pfn + "','" + strtohex(sdata) + "'); stt=0 return #global ;以下サンプルスクリプト /* title "LocalStorageTest" sdim txt, 1024 ; 文字列変数 iname="test" ; データの名前 check_item iname ; データの有無をチェック if (stat == -1) { set_item iname, "AAAAAA" ; データの保存 } get_item iname, txt ; データの読み出し st=stat ;結果の表示ループ repeat stick key if key!=0 : end redraw 0 pos 0, 0 mes "vdata=" + txt mes "stat=" + st redraw 1 await 16 loop */



zakki

リンク

2026/3/11(Wed) 22:47:01|NO.104816

対応ありがとうございます。
ちょっとしたデータ保持にはファイル保存してsyncfsしてファイル読み込みしてパースして…よりだいぶ楽でいいですね。



naya

リンク

2026/3/11(Wed) 22:54:43|NO.104817

zakkiさん、こちらこそです!、ご指摘いただきありがとうございました。
おかげでより良いモジュールにすることが出来ました(^^)



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.104809への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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