Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

byte配列からの文字列取得

質問です。
String a = new Stirng("あいうえおabcde12345")
byte[] ff = a.getBytes();
をした時に、Byte配列ffの11バイト目〜14バイト目の文字列"abcd"を取得する場合は
どのようにすれば宜しいでしょうか。

過去スレでByte配列ffから文字列取得する記事は
見つけましたが、バイト指定をしての取得は
見つけれませんでしたので、

よろしくお願い致します。

13

回答

13412

閲覧

13件の回答

評価

0

Stringにゃ、わざわざnewは必要ないよ。

それにしても、なんでbyte配列からとらにゃならんのよ。
俺なら、んなアホなコードは突っ返すことを考えるけどね。

評価

0

どうしてもってんなら、
System#arraycopy()でも使ってれば。

評価

0

Stringのコンストラクタがどれだけあるか知ってる?

評価

0

不良社員さん早速のご回答ありがとうございます。

>>それにしても、なんでbyte配列からとらにゃならんのよ。
>>俺なら、んなアホなコードは突っ返すことを考えるけどね。

とりあえず、やりたかったことを書いておきますね。
『テキストファイルから1レコード分(固定長)のデータを読み込み、読み込んだ1レコード分のデータを項目毎に文字コード変換関数のパラメータに渡してやりたい。
 ※項目毎に文字コード変換を行うのは出力ファイルをCSVと考えていて、
  項目毎に区切りのカンマを付加する為』

ちなみに⇒テキストファイルは改行、区切り文字、スペース等一切無く全てつながっている状態

詳細な流れは以下の通り

1)テキストファイルに何十万レコード分(固定長)のデータが入っていて、
  1レコードのバイト数分(固定長)読込む。
  ⇒BYTE[] ffに格納 

2)byte配列ffから、各項目のバイト数毎(固定長)取得し、
  文字コード変換関数のパラメータ(文字列として)に渡す。

 例えば1レコードが10項目で構成されている場合1項目めを取得して、
 文字コード変換関数に渡してやります。
 2項目め以降も順に同じ処理を繰り返します。

3)1レコード分の文字コード変換が完了すれば、次レコードにて1)を繰り返します。

以上です。

なにかご不明な点や、ご指摘(何でこうしないの?)とかございましたら、よろしくお願い致します。

評価

0

>>Stringのコンストラクタがどれだけあるか知ってる?

java始めて3日目なんでわからないです。。
すみませんが、どういう意図でしょうか。

評価

0

JavaDocを読むこと。

評価

0

>>JavaDocを読むこと。

読みました。$さんの言いたかったことがわかったような気がします。

⇒『String(byte[] bytes, int offset, int length) 』
もしくは、
『String(byte[] bytes, int offset, int length, String charsetName)』 

上記のコンストラクタを使用すれば、指定されたバイト部分(offset位置からのlength分)を取得できるということですよね?



評価

0

まずは試してみる。

ついでにgetBytesについてもちゃんと調べておくといいね。
引数なしの#getBytes()は使わないほうがいいということだけど。

それと、BufferedReaderなんかは使わないで、InputStreamから読み込んだbyte[]を自前のReaderで直に処理するほうがいいと思う。
1レコードのStringを構築し、それをgetBytes()でbyte[]に戻して、それぞれStringを構築…ってのが無駄だから。

評価

0

$さん、ありがとうございます。
BufferedReaderは使わずに以下の流れで
項目毎に文字列を文字コード変換関数へ渡します。

1. byte[] b = new byte[1レコードのバイト数]
 
2. InputStreamのread(b) メソッドで1レコードのバイト分を取得して、b配列へ 

3. String Str = new String( b , 各項目開始Idx , 各項目length)
で、各項目分の文字列を取得する。

4. Strを文字コード変換関数のパラメータへ渡す。

5. 次項目を対象に上記3.4.を繰り返す( 1レコード分の文字コード変換が終われば、7.へ)
 
6. ファイルを全て読み込み終わるまで上記2.〜6.を繰り返す

以上、私が知りたかったことは上記2. 3.の処理だったので、それ以外はかなりはしょってますが、
ご指摘があれば宜しくお願い致します。

評価

0

2008-11-29 23:52で自分で書いた2つ目のコンストラクタが何かが理解できれば、4が不要だというのが分かるだろう。

お節介だけど改行も文字(バイト単位でデータと見なされる)だということを忘れずに。
そのファイルを「テキスト」だと見なしてるのは、あくまで人間。

評価

0

明後日の方向から舞い戻ってきた俺様が通りますよ。

相手が固定長のデータストアだってんなら、
これこそBufferedStreamの出番だと思うんだが、違うのかな。

改行コードは無いとのことだが、
スペースはどうかね。
データ長が、フィールドの最大長に満たない場合は、
代わりになるものが入ってるんじゃないのかな。
例えば0x00とか。
ま、憶測で書いてるんで、余計だったら失礼。

評価

0

$さん
>>2008-11-29 23:52で自分で書いた2つ目のコンストラクタが何かが理解できれば、
>>4が不要だというのが分かるだろう。

コンストラクタの第4引数であるcharsetNameで指定した
文字コードで文字を取得してくれるから、文字コード変換関数に渡す必要ないということですよね?
ちなみに、文字コード変換は『Jipsコード⇒Unicode』に変換するのですが、charsetNameはJipsコードからUnicodeへのマッピング対応は大丈夫なのでしょうか?


不良社員さん

BufferedStreamを使うと、プログラムの仕様上
取得したレコード分の文字列をgetBytes()でbyte[]に戻す処理をはさまなくてはいけなくて、
だったらInputStreamで最初からバイトを読み込んでおけばイイじゃん!!ということです。
おそらくですが。。。
なんか間違ってたらごめんなさい^^;

>>改行コードは無いとのことだが、
>>スペースはどうかね。
>>データ長が、フィールドの最大長に満たない場合は、
>>代わりになるものが入ってるんじゃないのかな。

確かに、スペースはあるような気がする。。。
(気がするっていうのも、実際まだ入力のテキストファイルが出来ていない状態ですので^^;)

評価

0

俺は、ReaderやWriterじゃなくて、Streamと書いたぞ。

>InputStreamで最初からバイトを読み込んでおけばイイじゃん!!

BufferedInputStreamがあるだろが。

>確かに、スペースはあるような気がする。。。

もしあるんだったら、Stringにするのは、
しっぽをちょん切ってからにする必要があるんじゃない。

>JIPS
NECの独自コード?
標準で呑んでくれなかったら、面倒くさいことになりそうだねえ・・・。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。