• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:固定長データの情報処理について)

固定長データの情報処理について

このQ&Aのポイント
  • 固定長データの情報処理について勉強中です。9byteの固定長データを入出力する方法について、(1) 1byteから2byteはそのまま入出力、(2) 3byte~7byteは10進数からゾーン10進数に変換、(3) バイナリ進数からゾーン10進数に変換する方法について知りたいです。
  • また、10レコードで90byteのデータを書き出す際の方法についてもアドバイスをいただきたいです。
  • 今後は数値変換についても勉強していく予定です。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

> 元データの > (1)1byte~2byteで読みそのまま書き出す > (2)3byte~7byteで読みそのまま書き出す > (3)8byte~9byteで読みそのまま書き出す これだと、書き出し側も9byte単位になって、本来やりたいはずの15byte単位になりませんよ。 変換を後回しにするにしても、出力byte数は揃えておいた方がいいのでは? 出力内容を変更したいなら、#2にある「出力用バッファ」を用意するのが常套手段でしょう。 #2,#3さんのコードを借用して、効率無視で作れば while ((len = bis.read(inbuf, 0, 9)) == 9) { // (1) 2バイトをそのまま outbuf[0] = inbuf[0] ; outbuf[1] = inbuf[1] ; // (2) 5バイトをそのまま outbuf[2] = inbuf[2] ; outbuf[3] = inbuf[3] ; outbuf[4] = inbuf[4] ; outbuf[5] = inbuf[5] ; outbuf[6] = inbuf[6] ; // (2)' 最終的に9byte使うので残りbyte分の空き outbuf[7] = 0 ; outbuf[8] = 0 ; outbuf[9] = 0 ; outbuf[10] = 0 ; // (3) 2バイトをそのまま outbuf[11] = inbuf[7] ; outbuf[12] = inbuf[8] ; // (3)' 最終的に4byte使うので残りbyte分の空き outbuf[13] = 0 ; outbuf[14] = 0; bos.write(outbuf, 0, 15); } あるいは、#3に近い形なら while ((len = bis.read(inbuf, 0, 9)) == 9) { // (1) 2バイトをそのまま byte[] outbuf1=new byte[2] ; outbuf1[0] = inbuf[0] ; outbuf1[1] = inbuf[1] ; bos.write(outbuf1); // (2) 5バイトをそのまま byte[] outbuf2=new byte[9] ; outbuf2[0] = inbuf[2] ; outbuf2[1] = inbuf[3] ; outbuf2[2] = inbuf[4] ; outbuf2[3] = inbuf[5] ; outbuf2[4] = inbuf[6] ; // (2)' 最終的に9byte使うので残りbyte分の空き outbuf2[5] = 0 ; outbuf2[6] = 0 ; outbuf2[7] = 0 ; outbuf2[8] = 0 ; bos.write(outbuf2); // (3) 2バイトをそのまま byte[] outbuf2=new byte[4] ; outbuf3[0] = inbuf[7] ; outbuf3[1] = inbuf[8] ; // (3)' 最終的に4byte使うので残りbyte分の空き outbuf3[2] = 0 ; outbuf3[3] = 0; bos.write(outbuf3); }

ITJack
質問者

お礼

返信遅くなりました。 アドバイスどうもありがとうございます。 あらかじめ、領域を作ったほうが、後々作業しやすいのですね。 とりあえず領域を9byteから15byteにすることが出来ました。 byte型でのwriteメソッドの扱いがよくわからないのですが 色々とやってみます。 どうもありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.3

while ((len = bis.read(buf, 0, 9)) == 9) { bos.write(buf, 0, 2); bos.write(buf, 2, 5); bos.write(buf, 7, 2); }

ITJack
質問者

お礼

どうもありがとうございます。 最後にご質問させてください。 たとえばですが bos.write(buf, 0, 2);//配列1 bos.write(buf, 2, 5);//配列2 bos.write(buf, 7, 2);//配列3としたとき 配列2のbos.write(buf, 2, 5);の1byte目を00置換したい プログラムを指示する場合 どのようにソースを書けばよいのでしょうか?? よろしくお願いします。

すると、全ての回答が全文表示されます。
  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.2

> なお数値変換については今後勉強していければと思っております。 ということで,変換の仕方が今回の質問の要点ではないのなら, byte[] inbuf = new byte[9]; に対して,bis.read(inbuf, 0, 9) で9Bytesを読み込み, inbufを参照しながら byte[] outbuf = new byte[15]; に対して,数値変換の結果を書き出し, bos.write(outbuf, 0, 15) で15Bytesをファイル出力すればいいんじゃないですか。

ITJack
質問者

補足

アドバイスどうもありがとうございます。 数値変換に関しては、具体的に質問できるようになってから 新規で投稿できたらと思っております。 とりあえず数値変換は考えずに、 元データの (1)1byte~2byteで読みそのまま書き出す (2)3byte~7byteで読みそのまま書き出す (3)8byte~9byteで読みそのまま書き出す まだ数値変換の結果を書き出すまでは 先の話ですので 上記のような 配列?を領域を作っておきたいのです。 その後 (1)をそのまま出力 (2)数値変換 (3)数値変換 というような感じで配列ごとに管理できればと思っております。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「1レコードが9byteで」って, 入力と出力でバイト数が変わるんだけどどっちの話? 全体としてはほぼバイトごとに処理すればいいだけなのでそんなに難しくなさそうな気がするんだけどなぁ. どこで困ってるんだろう.

ITJack
質問者

補足

今回の例題だけでご説明します。 入力時 1レコード9bye (1)  2bye→2bye (2)   5bye→10bye(Cを削る)→9bye (3)   2bye→4bye 出力時 1レコード15byeになります。

すると、全ての回答が全文表示されます。

関連するQ&A