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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0101
××バイナリデータを文字列に変換するには8解決


××

リンク

2009/1/1(Thu) 21:55:34|NO.22153

タイトルのとおりで
バイナリエディタで数値の右側などによくある
数値を文字列に変換したデータを作りたいのですが

16進数の数値を文字列に変換する方法が分かりません
具体的には

・文字が、全角か半角か の判別方法
・数値を文字コードとして文字に変換する方法
・その逆で 文字から文字コードを取り出す方法(strfではなぜかうまくいかない)

の3点がわかりません
どなたか分かる方よろしくお願いします



この記事に返信する


GENKI

リンク

2009/1/1(Thu) 23:31:50|NO.22156

> 16進数の数値を文字列に変換する方法が分かりません

とりあえず最低限必要な資料を提示させていただきます。
HSPスクリプトエディタを起動して、メニューからヘルプ→HSPマニュアル目次、と開きます。
ブラウザが起動して「HSPマニュアル総合インデックス」が開くので、
「HSP3文字列のひみつ(中級者向け) (hsp3str.htm) 」をクリック。
文字列についての詳しい解説が記載されています。


> ・文字が、全角か半角か の判別方法

これについては少し複雑になるのでこちらのページを参考にしてみてください。
http://hspdev-wiki.net/?cmd=read&page=String%2F%B2%FE%B9%D4#o681c775
モジュール化してあるものもあります。



××

リンク

2009/1/2(Fri) 17:03:52|NO.22176

GENKIさんありがとうございます おかげで全角か半角かの区別には成功しました
したのスクリプトを実行すると
strlenでは調べられない、全角と半角が混じった文章の文字数を調べられます

#module #defcfunc dtox int prm1 ;---------------------------------------------------------- ; 渡された10進数を16進数へ ;---------------------------------------------------------- ; prm1 10進数の数値 ;---------------------------------------------------------- ; 戻り値 ; stat=0 成功,16進数を文字列で ;---------------------------------------------------------- word=strf("%x",prm1) return word #defcfunc xtod str prm1 ;---------------------------------------------------------- ; 渡された16進数を10進数へ ;---------------------------------------------------------- ; prm1 16進数の文字列 ;---------------------------------------------------------- ; 戻り値 ; stat=0 成功,10進数を数値で ;---------------------------------------------------------- x=prm1 : d=0 : size=strlen(prm1) repeat size getstr n,x,cnt,'g',1 if n="a" : n=10 if n="b" : n=11 if n="c" : n=12 if n="d" : n=13 if n="e" : n=14 if n="f" : n=15 d*=16 : d+=int(n) loop return d #defcfunc strtobin str prm1 ;---------------------------------------------------------- ; 渡された文字列をバイナリ値(16進数)の数列にへ変換 ;---------------------------------------------------------- ; prm1 変換したしたい文字列 ;---------------------------------------------------------- ; 戻り値 ; stat=0 成功,statに16進数の数値が代入 ;---------------------------------------------------------- size=strlen(prm1) : word=prm1 bin="" repeat size bin+=strf("%x",peek(word,cnt)) loop return bin #defcfunc bintostr str prm1 ;---------------------------------------------------------- ; 渡されたバイナリデータから文字数を調べる ;---------------------------------------------------------- ; prm1 バイナリデータ ;---------------------------------------------------------- ; 戻り値 文字数 ;---------------------------------------------------------- bin=prm1 : size=strlen(prm1)/2 : word="" : mozi=0 : f=0 repeat size if f=1 : f=0 : continue : else : mozi+=1 getstr code,bin,cnt*2,'g',2 code2=xtod(code) if ((code2>=129)&(code2<=159))|((code2>=224)&(code2<=252)) : f=1 : else : f=0 loop return mozi #global //▼▼▼▼▼▼以下 モジュールテスト用のスクリプト▼▼▼▼▼▼ /**/ word="くぁwせdrftgyふじこlp"////////////ここでいろいろ変わります dialog "「"+word+"」を文字コードであらわすと\n\n"+strtobin(word)+"\n\nとなります" dialog "「"+word+"」は"+bintostr(strtobin(word))+"文字です"

で ここからなのですが

シフトJISコードに照会して文字コードを文字に変換する

方法が分からないのです
「文字コードと文字の対応を表にしたテーブルを作る必要があるのかなー」
とか考えてみましたが、そもそもシフトJISの文字コードを取得する方法が分かりません
わかるかたいらっしゃいますか?



××

リンク

2009/1/2(Fri) 18:10:00|NO.22177

なんか勘違いしてました
通常HSPで使われる文字コードはshiftJISなので
メモリに書き込まれた数値はshiftJISとして自動で読み取ってくれるのですね
で、今困っていることは

ファイルを読み込んで,バイナリデータとして表示したいのですが
終端コード"00"を読み込んだ時点で処理が終了してしまう

という問題です
具体的にはmp3を読み込んでタグの編集を行いたいのですが
"00"を読み込んだ時点で処理がとまってしまうのです
どうすればよいでしょうか



通りすがり

リンク

2009/1/2(Fri) 18:10:48|NO.22178

なかなか面倒なことをしてらっしゃる気がします…^^;

word="くぁwせdrftgyふじこlp" sdim bin,strlen(word)*2 repeat strlen(word) bin+=strf("%02x",peek(word,cnt)) loop mes bin
peek,poke命令で簡単に出来そうな気がしますが…



f(浮気中)

リンク

2009/1/2(Fri) 20:25:55|NO.22179

peekで調べてNULLだったら0x20にでも置き換える程度で良いんでね?



inovia

リンク

2009/1/3(Sat) 01:22:22|NO.22183

お遊び程度に!と思ってID3v1タグを編集する
ツールを作っていたら出来てしまったオチ。
http://homepage2.nifty.com/MJHS/hsp/mp3id3v1.hsp

汚い上に、v1タグにしか対応していません。
v2は面倒くさいんだなぁ。
まぁ…参考までにどうぞ。(^o^)丿



××

リンク

2009/1/3(Sat) 19:56:29|NO.22191

>>通りすがりさん
変数のデータのbit値を16進数であらわした文字列に変換するルーチン(strtobin)の
アルゴリズムは通りすがりさんの説明と同じです

>>inoviaさん

bload music,"A.mp3"
として 変数musicをデバッグウィンドウの[メモリダンプ]でみると
"00"の1個手前(アドレス00000003)までで読み込みが止まっていました
"00"が出てたのが原因だと思っていましたが
inoviaさんのスクリプトを見て,最後までbloadで読み込めていることに気がつき
この違いは何なのか自分のスクリプトと見比べてみたところ
「変数に十分なバッファサイズを確保していない」ことに気がつきました
ためしにsdimでバッファを確保したところ,正常に読み込むことに成功しました
サンプルありがとうございました

>>fさん
読み込むことには成功したので,00を別の数値に置き換える方法でやってみます



××

リンク

2009/1/3(Sat) 20:09:27|NO.22192

00を01に置き換えてスクリプトを組んだところ,無事に成功しました
GENKIさん,通りすがりさん,fさん,inoviaさん ありがとうございました



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