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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0923
catsバイナリデータから英数字記号のみを判別する2解決


cats

リンク

2014/9/23(Tue) 10:22:00|NO.65149

現在バイナリデータを文字として画面に出力するプログラムを作っています。
一般的なバイナリエディタでは英数字記号以外の文字を"."で表示しています。

(例) 0x00 0x11 0x22 0x33 0x44 0x55 0x66 ↓ .."3DUf
ひらがなや漢字も".."として表示されます。
バイナリエディタの表示方法とまったく同じことをしたくていくつかの方法で試してみました。

screen 0, 1080, 240 // 変数に適当なバイナリデータ書き込み sdim buf, 128 repeat 64 poke buf, cnt, cnt loop repeat 64 poke buf, 64+cnt, 128+cnt loop pos 0, 0 : mes "▼mesでそのまま表示" sdim char, 64 repeat 128 getstr char, buf, cnt, 0, 1 pos cnt*8, 32 : mes char loop pos 0, 64 : mes "▼getstrの返り値で判定" repeat 128 getstr char, buf, cnt, 0, 1 pos cnt*8, 96 if strsize == 0 : mes "." if strsize == 1 : mes char if strsize == 2 : mes "." loop pos 0, 128 : mes "▼peekの返り値で判定" repeat 128 getstr char, buf, cnt, 0, 1 pos cnt*8, 160 if peek(char, 0) <= 31 : mes "." if peek(char, 0) >= 32 : mes char // これ以外にも判定をたくさん付ける loop stop
peekで判別するのが最も正確だと思うのですが、どうも納得いきません。
・peekでは判別が面倒
・2バイト文字をはじくだけでは0x00 - 0x31のような文字に対応できない
・一般的な英数字判別方法はヌル文字(0x00)に対応していない
というようなことが問題だと思います。
あらゆるバイナリデータから簡単に英数字記号を判別できる方法はあるのでしょうか。



この記事に返信する


掘木

リンク

2014/9/23(Tue) 11:04:36|NO.65150

peek後の数値判別がめんどくさいなら、C標準のisprintに任せればどうだろう。

#uselib "msvcrt.dll" #cfunc isprint "isprint" int #define DATASIZE 256 sdim buf,DATASIZE // bufになにかを書き込む repeat DATASIZE poke buf,cnt,cnt*0x37 loop // 書き込み終わり repeat DATASIZE pos cnt\16*8,cnt/16*16 peektmp = peek(buf,cnt) if ( isprint(peektmp) ){ mes strf("%c",peektmp) }else{ mes "." } loop
一般的な英数字判別方法って何使うんだろう・・・。



cats

リンク

2014/9/23(Tue) 11:34:55|NO.65152

>掘木 さん
Cランタイムライブラリはあまり使ったことがありませんでした。
isprintは初めて聞きましたが、表示文字の判別ができる関数があるとは驚きです。
>一般的な英数字判別方法
2バイト文字の判別やpeekで128だったか以上を調べる方法です。
一般的というのは語弊がありますね。
とにかく無事解決しました。
ありがとうございました。



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