- ベストアンサー
vNoteのBODY部の取得(長めです)
ドコモの携帯からパソコンへ画像を送るとjpgファイルがBase64でエンコードされ、パソコン側では「mypic.vnt」というvNote形式のファイルになるのですが、元の画像に戻すにはBODY部をデコードすれば良いという事がわかりました。試しにBODY部のみを切り取ってデコードしたら、ちゃんと元のjpgファイルになりました。 そこで、BODY部の部分だけを取り出してデコードするプログラムを作りたいと考えています。(BODY部:「/9j/」から「END:VNOTE」の直前までの部分) ファイルの中身の部分文字列を取り出す方法としてどのような方法が可能でしょうか?調べてみてsubstringというメソッドを使えば良いかなと思ったのですが、strに直接文字列が代入されているわけでもないし、引数の番号も何番目かなんてファイルによって異なるので使えないですよね…。。(見当違いの考え方だったらすみません…)キーワード検索みたいなものがあればいいのですが…。どなたかご存じの方がいらっしゃったらご教授お願いします。 ↓はvNoteの中身です。 --------------------------- BEGIN:VNOTE VERSION:1.1 X-DOCOMO-TYPE:JPEG X-DOCOMO-SIZE:288X352 X-DOCOMO-FILESIZE:13095byte X-DOCOMO-FILENAME:DSC00820.jpg SUMMARY;ENCODING=QUOTED-PRINTABLE;CHARSET=SHIFT_JIS: DATE:20041004T082700Z X-DOCOMO-BODY;ENCODING=BASE64:/9j/4QyrRXhpZgAASUkqAAg・・・省略・・・・・・・・・・・・・・・・・ Mgo0AT7JFg/6Quagkh2dJEb6GgepD2pMUDExSYoASigQ0jmigBKKAP/Z END:VNOTE ---------------------------
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1です。強調して、もう一度書きます。 「行単位で」処理をする。 (「行単位で読み込む」と言っているのではない。「処理をする」。) --- ファイルに100行、200行書かれていようと 1行1行取り出せば、 それは単なる、見慣れたString型文字列。 この1行文字列に、Base64データが入っていれば、 そこを取り出せばよいし、 入っていなければ、 何も処理をしなければよい。 以上の処理を、全行分、繰り返せば、 あ~ら不思議、 完璧なBase64データが得られている。 String stock="";//Base64データ蓄積用変数 while(true) { ・line = readLine(); ・もしlineにBase64データが入っていれば、 ・その部分(Base64データの部分)を切り出して ・切り出したものを蓄積用変数stock に蓄える(※文字列連結) } --- 1行1行見ていけば、難しい話も簡単になる、ということです。 (※ただし上記の流れを実際にソースコードにするのは、 プログラミング初学者にはちょっと難しい部分が1箇所(?)あるかも) --- で、これは前置き。 これからが本題。(?) ちゃんとした入門書を使ってしっかり勉強しましょう。 「ファイルデータを解析したい」という要求は「高度な要求」なので、 だったらそのまえに「基礎事項」を身につけてから 質問すべし、ということ。 質問者さんがreadLine()、substring()、equals()、charAt()、indexOf()、 StringBuffer、文字列連結など(の使い道)でつまずいているようでは、 話のしようがないですよ、回答のつけようがないですよ、ってこと。 現に、#2さんが「答え(処理の流れ)」を書いているのに、 (「従って、行毎に…」の箇所) 質問者さんはそれにはまるで反応を示してませんよね。 つまりやっぱり入門書程度のことが身についていないので、 回答者の回答の言葉の「意味」がわからないのだと思います。 ってことで、「勉強してから質問」。 そうすれば道は開けるかと。
その他の回答 (2)
- ngsvx
- ベストアンサー率49% (157/315)
>ファイルの中身の部分文字列を取り出す方法としてどのような方法が可能でしょうか? ファイルの中身を直接取り出すことはできません。 (大抵の言語はそうです) 一度、メモリ(変数)に格納してから作業します。 今回の場合は、画像データということでサイズがかなり大きくなることが 予想されます。 従って、行毎にデータの開始となる文字を探し、見つかったら終了となる文字を 見つけるまでファイルに書き出すようなことになると思います。 (小さければ、全部読み込んでもいいでしょう) ご質問にある例を見る限り、開始データは、 BODY;ENCODING=BASE64:/9j/ でいいような気がします。 ただし、BEGIN:VNOTE から END:VNOTE の間にあることが必要でしょう。 また、このデータが添付ファイル中のことなのか不明ですが、 メールファイルそのものの中に記述されているのなら、 メールファイルのフォーマットを解析し実行する必要もあります。 ちなみち、文字列の中から、任意の文字列を探すことはできますよ。 String#indexOf()を見てください。 よけいなお世話かもしれませんが、もう少しいろいろと勉強してからでないと、 難しい気がしますけど。
お礼
お礼が遅くなり申し訳ありません。 配列にデータを入れる事は出来ました。 このデータは添付ファイル中のことではないので、データは上に書いたものだけになります。 任意の文字列を探す方法を教えていただきありがとうございます。 まだよくわからないのでこれから勉強しようと思います。 確かにもっと勉強しないと難しいですよね…。。。 ありがとうございました。
- kacchann
- ベストアンサー率58% (347/594)
>ファイルの中身の部分文字列を取り出す方法としてどのような方法が可能でしょうか データのフォーマットが「行単位」である以上、 それを処理するほうも、 行単位、つまり、よくある BufferedReader br; while(true) { String l = br.readLine(); ・ ・ ・ } みたいな処理でいいのでは? http://msugai.fc2web.com/java/IO/BufferedReader.html 自然だし簡単なやり方だと思う。部分文字列を取り出すのに、悩むこともないし。
お礼
お礼が遅くなり申し訳ありません。 行単位で読み込む事はわかりました。 部分文字列の取り出し方がまだよくわからないですが、がんばってみようと思います。 ありがとうございました。
お礼
お礼が大変遅くなってしまい申し訳ございません。 なんとかプログラムは出来ました。 こんな初心者に丁寧に教えて下さりありがとうございました。 これからはもっと勉強してから質問したいと思います。 本当にご迷惑おかけしました。