Last Update : 2007/04/xx
メモリブロックのクリア、指定した1バイト値でメモリ領域を一括変更する命令です。命令名の由来は、「memory set」から。
memset バッファ変数, 変更する1バイト値, 変更するバイトサイズ, メモリオフセット
HSP3では、1バイト書き込みにpoke関数、2バイト書き込みにwpoke関数、4バイト書き込みにlpoke関数が用意されてますが、この命令はそれ以上のサイズの書き込みが可能です。具体的にサンプルで解説しましょう。
半角1バイトの記号「!」(エクスクラメーションマーク、0x21)を64バイト(64個)分書き出したテキストファイルを出力してみます。sdim命令で書き換え対象となる変数領域を確保しておきましょう。
// 必ず領域を確保(ここでは64バイト分) sdim buf ; 64バイト分書き出し memset buf, '!', 64 bsave "hogege.txt", buf
次に「!」の32バイト分と、その後半部分に「?」(クエッションマーク、0x3F)を32バイト分書き出したテキストファイルです。
sdim buf ; 前半の32バイト分 memset buf, '!', 32 ; 第4パラメータでオフセット値指定して後半の32バイト目から memset buf, '?'. 32, 32 bsave "hogege.txt", buf
memset命令の第2パラメータは1バイトの半角文字(半角カタカナOK)を指定しなければなりません。たとえば、2バイト文字の日本語はダメです。(ここらへんはHSP付属のドキュメント『HSP3文字列のひみつ(中級者向け) (hsp3str.htm)』をチェック!
// ○ memset buf, 'ア', 64
// ×ダメダメ (コンパイルエラー) memset buf, "あ", 64 // ×ダメダメ (エラーにはならないが文字化け) memset buf, 'あ', 64
HSPにはファイルを削除する命令にdelete命令が用意されてます。実際に削除すると、「ごみ箱」を経由しないで消去された形になります。ただ、ハードディスク上にはデータは残っており、条件が整えばファイルを復旧・復元させることができます。フリーのファイル復元ツールがVectorで公開されてます。
ここでmemset命令を使えは、このようなツールで復元できないファイルの削除が可能です。ファイルを読み込み(notesel命令+noteload命令、bload命令)、その変数バッファの内容を一気に書き換え(memset命令)て、ファイルをそのまま上書き保存(notesave命令、bsave命令)し、そのファイルを削除(delete命令)する流れです。
こうすることで、仮にファイル自体は復元できても、肝心の中身がスッカラカンになってるわけです。