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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0305
kdiコード00の読込方法15解決


kdi

リンク

2010/3/5(Fri) 10:45:02|NO.31006

テキストファイルを読み込んで表示するプログラムを作成していますが、
対象に文字コード '0x00' が含まれていると
該当箇所までしか bload 命令で値が取得できません。

例えば、次のデータを用意します。
inByte00.txt >
文字列表記 ) 123 456789
16進表記 ) 31 32 33 00 35 36 37 38 39

ファイルサイズを exist で取得すると 9 byte と取得できるのですが、
bload で取得した文字列を strlen で確認すると 3 byte となってしまいます。

00 を終了コードと見なしているようですが、
これを空白(0x20)等に置換して読み込むことはできないものでしょうか。

ご教授、お願い致します。



この記事に返信する


kdi

リンク

2010/3/5(Fri) 10:50:58|NO.31008

参考までに、私が上記問題を確認したソースを添付します。


; ; 文字コード 00 をHSPで読み込もうとするプログラム ; ;============================================================== ; ユーザパラメータ ;-------------------------------------------------------------- ;処理対象ファイル-場所 P_LogDir = dirinfo(0) ;処理対象ファイル-名称 P_FileName = "inByte00.txt" ;============================================================== ; 定義 ;-------------------------------------------------------------- W_Data = "" ;ファイル内のデータ W_Size = 0 ;ファイルのサイズ W_DLen = 0 ;実際に読み込まれたデータ長 ;============================================================== ; 主処理 ;-------------------------------------------------------------- ;存在チェック L_FileName = P_LogDir + "\\" + P_FileName exist L_FileName if strsize <= 0: end ;データ読込 W_Size = strsize sdim L_Data, W_Size bload L_FileName, L_Data ;出力データ編集 W_DLen = strlen(L_Data) W_Data = L_Data ;============================================================== ; 処理結果表示 ;-------------------------------------------------------------- x=1: y=0: s=16 screen 0,320,240 cls 4 font "MS ゴシック",s color 255,255,255 pos x*s,y*s: y++: mes "----------------------------" pos x*s,y*s: y++: mes "ファイルサイズ = " + W_Size pos x*s,y*s: y++: mes "データサイズ = " + W_DLen pos x*s,y*s: y++: mes "----------------------------" pos x*s,y*s: y++: mes "データ内容..." pos x*s,y*s: y++: mes W_Data ;============================================================== ;[EOF]



SYAM

リンク

2010/3/5(Fri) 11:01:36|NO.31009

strlen() はバッファの長さではなく あくまで「文字列の長さ」を取得する関数です。
0x00 は文字列の終端を表すものですから、strlen() はそこまでの長さを返してしまいます。

bload で読んだのであれば、 0x00 以降にもちゃんとデータは入っているはずです。
bload で読み込んだあと、strlen ではなく exist で取得したファイルサイズを使って 0x00を 0x20 に置換するスクリプトを作るといいでしょう。



SYAM

リンク

2010/3/5(Fri) 11:32:06|NO.31010

ごめんなさい。ちょっと訂正。
existで得た ファイルサイズ ではなく、
bload 命令を実行した直後の システム変数 strsize を使いましょう。


// テスト用に長さ 9 のファイルを作り、 // 5バイト目に 0x00 を埋め込んでみる. sdim a,10 a="NEKO_NEKO" poke a,4,0 bsave "test.dat",a,9 // // それを読む. // sdim b,10 bload "test.dat",b buffer_length = strsize ; ←実際に読み込まれたデータ長 mes "文字列長 = " + strlen(b) mes "実際に読み込まれたデータ長 = " + buffer_length mes "文字列 = " + b repeat buffer_length if(peek(b,cnt) == 0x00) { poke b,cnt,0x20 } loop mes "置換後の文字列 = " + b



kdi

リンク

2010/3/5(Fri) 12:08:38|NO.31011

SYAM様

早い返事と的確な回答に感謝します。
置換部分のソースを組み込むことにより
終了コードを含むファイルを文字列として取得する事が可能となりました。



ですが、バッファの内容を1文字ずつ置換処理している為
巨大なファイルサイズを処理したときに処理時間が長くなってしまいそうです。

具体的に想定される読込データ量は、
1件あたり最大 3M byte のテキストファイルを
最大 7 件まで結合しますので、計最大 21M byte となります。
(因みに、計最小は 100 byte を下回ります)



試しに 1M byte のテキストを置換処理したところ、
私のPCでは 5 秒ほど処理時間が掛かってしまいました。
理想は 1 秒くらいです。



0x00を検索するアルゴリズムを最適化するしか無いのでしょうか。



hoogle

リンク

2010/3/5(Fri) 12:20:56|NO.31012

おめでたちゃんなのでハッキリ言っておくと、
最初から置換の不要なデータを用意することが今回のケースでは最適な手段です。

ここで知ったかぶってアルゴリズムの計算量に無頓着な方は「○○法というアルゴリズムがある」と回答するでしょう。



kdi

リンク

2010/3/5(Fri) 12:26:15|NO.31014

hoogle様

ご指摘ありがとう御座います。

処理したいデータの内容や規格は私から操作をすることはできません。
作成したいプログラムは別ソフトから吐き出されたログを閲覧するソフトです。

そのログデータに 0x00 が含まれている為、
このような質問をさせて頂いております。



そして検索の仕方を工夫するしか無いという回答でしたら、
それは表題とは議論が離れますので、解決とするつもりです。



inovia

リンク

2010/3/5(Fri) 13:05:41|NO.31015

HSPはループなどは処理が遅いので
(インタプリタなので当然ですが)
1バイト置き換えするところをマシン語化してみました。
内部でサイズチェックはしていませんので、
バッファオーバーフローに注意してください。


#module "_ReplaceByte_" #uselib "kernel32.dll" #func VirtualProtect "VirtualProtect" var,int,int,var #define xdim(%1,%2) dim %1,%2: VirtualProtect %1,%2*4,$40,AZSD #deffunc ReplaceByte var src, int srcsize, int a, int b xdim fncode,40 fncode.0 = 0x33EC8B55, 0x0C4D39C9, 0x458B187E, 0x0FC10308, 0x553B10BE, 0x8A057510 fncode.6 = 0x10881455, 0x0C4D3B41, 0xC033E87C, 0x0010C25D prm.0 = varptr(src), srcsize, a, b return callfunc(prm, varptr(fncode), 4) #global sdim buf,256 // 0x00 を 0x20 に 1byte 置き換え ReplaceByte buf,256,0x00,0x20



kdi

リンク

2010/3/5(Fri) 13:27:01|NO.31016

inovia様

頂いたモジュールを組み込んだところ、処理時間が2割ほど短縮できました。
私にはまだマシン語化の知識がありませんので大変助かりました。
感謝です。



まだまだ浅薄な自分ですが、ここまでの回答で満足しました。
これにて当スレッドを解決と致します。



親切に解答と意見を下さった、
SYAM様
hoogle様
inovia様

本当にありがとう御座いました。



inovia

リンク

2010/3/5(Fri) 13:58:57|NO.31017

訂正です。
確保しすぎなだけで動作には問題ありませんが一応。

xdim fncode,40 ↓ xdim fncode,10



kdi

リンク

2010/3/5(Fri) 15:47:47|NO.31018

inovia様

訂正箇所を確認しました。
VirtualProtect への設定時に乗算されていますね。

有難う御座います。



hoogle

リンク

2010/3/5(Fri) 18:44:49|NO.31021

ふふ マシン語さまさまやなぁ。

マシン語あれば何でも解決

あほらし。マシン語で書けよ。

HSP覚えるよりマシン語覚えればHSPいらねぇんじゃね。



hoogle

リンク

2010/3/5(Fri) 19:23:40|NO.31023

ワロタwww



hoogle

リンク

2010/3/5(Fri) 20:49:18|NO.31024

ワロタwww




低脳さに



tsuka

リンク

2010/3/5(Fri) 21:08:33|NO.31025

意図的にハンドルネームを被せるなりすましは荒らし行為です。

155.198.243.100 icradio.media.su.ic.ac.uk: .NET〜
174.129.28.18 ec2-174-129-28-18.compute-1.amazonaws.com: マシン語〜
62.193.245.233 wpc3016.amenworld.com: アルゴリズム〜
121.119.80.178 i121-119-80-178.s05.a011.ap.plala.or.jp: 低脳さに〜

最後の以外はプロクシでしょうが、この掲示板はプロクシを通しての書き込みは禁止されています。



しきり2

リンク

2010/3/5(Fri) 21:56:16|NO.31029

なりすましっていうか
違うIPでhoogleがふたりイタから、流れに乗っただけなんだが

それにしても串通してまで書き込みしてメリットあるんかw



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