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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
1001
CONバイナリとテキストの判別17解決


CON

リンク

2012/10/1(Mon) 04:14:22|NO.49650

みたいなことは可能でしょうか

画像ファイルじゃないけど拡張子だけが「.jpg」になっているファイルを
誤ってpicloadで読み込んでしまった場合のエラーを回避したいのです。

例えばネット上の画像を「〜.jpg」という名前で保存したつもりが
その画像は削除されていて、かわりに表示される404〜などのHTML形式のものを画像ファイルとして
保存したような場合です

ご教授お願いします。



この記事に返信する


てん

リンク

2012/10/1(Mon) 04:55:03|NO.49651

jpegデータの規格をネットから漁ってきて、企画に適合しているか調べましょう。



f(始業中)

リンク

2012/10/1(Mon) 08:39:04|NO.49652

on error で良いんじゃね?



@key

リンク

2012/10/1(Mon) 11:13:56|NO.49654

結構バイナリデータの拡張子判別は難しいです

それこそ、専用ソフトになるくらいに
http://www.vector.co.jp/soft/win95/util/se085018.html



てれてれ

リンク

2012/10/1(Mon) 18:34:56|NO.49663

>結構バイナリデータの拡張子判別は難しいです
いやいや、対象ファイルがjpgってわかってるなら簡単でしょ。

JPEGファイルのSOIは0xFFD8、EOIは0xFFD9なので、
それをチェックすることで99.9%以上の精度で識別出来ます。


#module #defcfunc Jpeg_Check str FileName exist FileName : if strsize = -1 : return 0 dim buf : FileSize = strsize bload FileName,buf,2,0 : if buf != $D8FF : return 0 //SOI bload FileName,buf,2,FileSize-2 : if buf != $D9FF : return 0 //EOI return 1 #global // // val = Jpeg_Check(p1) // p1 : チェックするファイル名 // // [jpg]形式のファイルであれば 1 が返る。 // それ以外のファイル形式であれば 0 が返る。 // dialog "",16 Rs = Jpeg_Check(refstr) if Rs = 0 : mes "JPGファイルでは無いよ" if Rs = 1 : mes "JPGファイルだよ"m



いかろ

リンク

2012/10/2(Tue) 10:18:44|NO.49687

fさんのおっしゃるとおりonerrorをつかうのが一番簡単かと思いますが、
ファイルのバイナリからしらべたい場合は「マジックナンバー」と「調べたいファイルの拡張子」でググるとだいたい分かると思います。



CON

リンク

2012/10/21(Sun) 16:49:15|NO.50128

返事が遅れましたが
みなさん回答ありがとうございます

>>てんさん
いろんなキーワードが出てきましたが
自分ではどうすれば良いか分かりませんでした。
ググる力も大切ですね。

>>f(始業中)さん
自分も最初それで回避できるかと思ったのですが
Document Libraryに
>onerror命令は、エラーから回復させるものではありません。
とあったので、できるだけ未然に回避したいと思いまして…

>>@keyさん
僕も拡張子判別ソフトをよく使ってるので仕組みが気になってました。
テキストかバイナリかどうかなら簡単かと思ったのですが
やはり基本は難しいのでしょうか。

>>てれてれさん
モジュールまで書いていただき、ありがとうございます。

SOIとEOIというのがあるんですね。

これはJPEGだけなのでしょうか。
調べてみた感じではSOIとEOIはJPEGにしかなさそうですが。

てれてれさんはこういう事をどこで知ったのですか。気になります。
自分が無知なだけでしょうか。

処理も早いのでこのモジュールでいけそうです
助かります

>>いかろさん
僕も最初自分で解決しようと思い、
何か手がかりは無いかとJPEGファイルをメモ帳で開いたところ、
どのファイルにも先頭近くに「JFIF」という文字があることに気づきました。

これがマジックナンバーでしょうか。

もう一度よく調べてみます



KA

リンク

2012/10/21(Sun) 18:09:33|NO.50131

>>どのファイルにも先頭近くに「JFIF」という文字があることに気づきました。

JPGに限らずアプリ用のバイナリデータは、先頭に独特のデータの有る事が
殆どです。ちょっと本気で調べようと思えば、「バイナリエディタ」に行き当
たるでしょう。



f(出張中)

リンク

2012/10/21(Sun) 19:33:14|NO.50136

>Document Libraryに
>>onerror命令は、エラーから回復させるものではありません。
>とあったので、できるだけ未然に回避したいと思いまして…


それは「実行時にAPI呼び出ししようとしたら対応してなかった」とか
行ないたい処理が行なわれなかったことを肩代わりできないと言っているのであって

読んでみてエラーになるかどうかの確認に関係ない。



CON

リンク

2012/10/21(Sun) 20:54:01|NO.50142

>>KAさん
バイナリエディタですか…
聞いたことはあったのですが、こんなものとは。

いくつかのサイトに英数字が2桁ずつ並んでいる風景があったので
バイナリエディタを使ってみたときピンときました

バイナリデータは自分の中で未開の地だったので、少し一歩を踏めた気分です。
ありがとうございます。

>>f(出張中)さん

onerror *error *start repeat picload "x.jpg" wait 1 loop *error mes "エラー" return
上の様にonerrorでラベルに飛んだあとreturnで戻ると
ラベル内を無限ループしてしまいす。

簡単なスクリプトなら飛んだ先でgotoを使って*startに戻れますが、
エラーの度に何度もgotoで飛ぶなら未然に回避するほうがいいと思ったのと、

onerror命令によりエラー後の処理を指定した場合であっても、 必要な処理が終わったら、そのままアプリケーションの実行は再開せずに、 なるべくend命令で終了させてください。 onerror命令は、エラーから回復させるものではありません。 エラー発生の原因によっては、 HSPのシステム自体が不安定になったり障害が発生することも有り得ます。 onerror命令を使う場面としては、実行ファイル作成時にエラーが発生した場合にアプリケーション側で独自のエラー表示を行ないたい場合や、特定のエラーが発生する場合にだけデバッグのための表示を行なうなどが考えられます。
を見る限りは、やはりどんなエラーであろうとonerrorで回復する手段は良くないと判断しましたが…

みなさんはどう思われますか。



HK2

リンク

2012/10/21(Sun) 21:55:59|NO.50143

よくないと思います。
onerror命令は他のon〜命令と同じようには扱えません。
特にgosubキーワードをつけると挙動が全く違います。


onclick gosub *event gosub *l1 mes __line__ stop *l1 mes __line__ gosub *l2 mes __line__ return *l2 mes __line__ // font//エラーを起こす mes __line__ repeat if(flag){ break } wait 1000 loop mes __line__ return mes __line__ *event mes __line__ mes "code:"+err flag=1 return mes __line__
onclickをonerrorに変え、font命令のコメントアウトを解除した場合、
通常実行されないはずのreturn命令より先にあるmes __line__が実行されてしまいます。



CON

リンク

2012/10/21(Sun) 22:26:37|NO.50146

>>HK2さん
たしかに動きがおかしいですね;

僕の場合gosubが抜けていましたが
付け加えて実行しても4回目でstopされてしまいました。
なんか不安定ですね。


onerror gosub *error
*start
repeat
picload "x.jpg"
wait 1
loop
*error
mes "エラー"
return

それより__line__というものを初めて見たので感動です。



f(出張中)

リンク

2012/10/22(Mon) 02:16:54|NO.50150

>必要な処理が終わったら、そのままアプリケーションの実行は再開せずに、 なるべくend命令で終了させてください。
onerror命令は、エラーから回復させるものではありません。

しまった、他人にマニュアル読め読め言っておきながらこんな一文あるのに気付いていなかったわ。


onerror *error *start repeat picload "x.jpg" wait 1 loop *error mes "エラー" return
>上の様にonerrorでラベルに飛んだあとreturnで戻ると
>ラベル内を無限ループしてしまいす。

・・・エラー無くても無限ループじゃねぇか。




onerror gosub *error onerror 0 // 普段は関係ないエラーに反応しないよう無効化 *start errflg = 0 : onerror 1 // 必要な時に有効にする picload "x.jpg" onerror 0 // 用が済んだら関係ないエラーに反応しない様無効にする if errflg != 0 { // 結果判定 mes "エラー" } stop *error errflg = 1 // onerrorで飛んできたらフラグを立てて返す return

俺はこーゆーのを想定してた訳だが
最初の文があるのなら、やらん方がいいかもな。


onerror gosub *error gosub *testLoop stop *testLoop repeat picload "x.jpg" if errflg = 1 { mes "終了" return } wait 1 loop return mes "異常" stop *error mes "エラー : " + lparam + "行 errorcode" + wparam errflg = 1 return

onerrorで飛んでったらrepeatやらgosubのネストが消えるぽいな。
御免なさい。この方法は使わないほうがいい。



ANTARES

リンク

2012/10/22(Mon) 05:17:48|NO.50152

 onerrorは明らかに終了する必要のない特定のエラーについて
エラー処理を行なうためのものです。
エラー処理の後、returnで戻ってよい場合というのは
現実にはほとんどないと思います。

onerror goto *l_error file="" input file button "表示",*l_display stop *l_display screen 2 picLine=__line__: picload file stop *l_error ;特定の終了する必要がないエラーが起きた場合 if wparam==13 { if lparam==picLine { dialog "ファイル"+file+"が見つかりません。" gsel 0,1 stop } } ;想定外のエラーが起きた場合 dialog ""+lparam+"行でエラー"+wparam+"が起きました。" end



CON

リンク

2012/10/23(Tue) 00:39:48|NO.50167

>>f(出張中)さん
いろいろ試していただいて、ありがとうございます。
>onerrorで飛んでったらrepeatやらgosubのネストが消えるぽいな。
ってことはループはせずに一発の確認ならonerrorでもおkな訳ですね。
今後のアップデートで改善されることなんでしょうか。

>>ANTARESさん
やっぱりそう使うものなんですね。
僕も今後ソフトを作るときはエラー対策に気をつけます。


最初はテキストとバイナリは決定的に違うものだと思っていたのですが
テキストデータも中身はバイナリデータと何ら変わりがなかったのですね。

昨日と今日でなんとなく分かったのは
・1バイト(8bit)の中に2^8は256なので0〜255までのデータを収められる。
・2バイト(16bit)の中には2^16は65536なので0〜65535までのデータを収められる(たぶん)。
・KAさんがおっしゃる様にアプリ用のバイナリデータは先頭と後尾に独自データがあるんですね。
 てれてれさんの言うJPEGのSOIとEOIや、いかろさんの言うマジックナンバーもこれに当たるのかな。
 てんさんの言ってた「規格に適合しているか」もこういう意味だったのですね。
 やっと謎が解けました;

僕がなんとなく気になっているのは
・半角の文字が1バイトで全角が2バイトなのは、Unicodeで0〜255までが半角だから?
・確認用の独自データが後尾にもあるのはファイルが壊れてないか確認するため?
って勝手に推測してますが…

昨日、試しにbloadとpoke命令を使って画像ファイルに
他のバイナリファイルを埋め込んだりしてみましたが、ちゃんと表示されるんですね。

実際に触れてみてバイナリについては少し分かりました。
新しいことを知るこの感じなんかワクワクしますね。

みなさん、ありがとうございました。



kanahiron

リンク

2012/10/23(Tue) 01:25:39|NO.50168

>>・半角の文字が1バイトで全角が2バイトなのは、Unicodeで0〜255までが半角だから?
UnicodeではなくてASCIIだと思います(打ち間違え?)
ASCIIで検索すれば文字コードや制御文字などの一覧ありますよ



kanahiron

リンク

2012/10/23(Tue) 01:33:23|NO.50169

ごめんなさい ASCIIとは微妙に違うみたいですね
ASCII(恐らくCONさんの言う半角文字)は0〜127の範囲で8ビット目は制御用に使われるようです



KA

リンク

2012/10/23(Tue) 08:07:05|NO.50170

>>半角の文字が1バイトで全角が2バイト
これを考えるには

アスキーコード
マルチバイトコード
ユニコード

など、文字コードの考えが必要になります。
データに依っては、各国で文字が異なります。



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