2012-02-29 14 views
2

Stringの代わりにバイト配列を使用するので、String演算を実行する必要があります。もちろん、私はそれらからStringを作成することはできず、操作の後にバイト配列を戻すことはできません。私はその場で操作を実行する必要があり、以下のようなもの:バイト配列でString操作(indexOf、splitなど)を行うByteUtils実装はどこにありますか?

int x = ByteUtils.indexOf(myByteArray, (byte) 'a'); 

EDIT1:ONE CHAR(なしユニコード、これはASCIIですが)=> ONEバイトと仮定すると。

EDIT2:indexOfだけでなく、たくさんの文字列操作が必要です。あなたがKnuth-Morris-Pratt Pattern Matching Algorithmを使用することができますバイト配列に検索するための

+1

Arrays.binarySearch ???? http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html –

+0

バイト配列は文字列と互換性がありません。JavaのようなUnicodeの世界では間違いありません。マルチバイト文字とロケールの違いは、このアプローチは時間の無駄ですので、標準的な実装はありません。簡単な操作(あなたの例での検索のような)では、標準的な配列機能を使うことができます。複雑な操作の場合、byte []でそれらを実行すべきではありません。 – Viruzzo

+1

@SergeyBennerバイナリ検索はソートされた配列でしか動作しません。これは明らかに汎用文字列**を含むbyte []は**ではありません。 – Viruzzo

答えて

1

バイトと文字を混合しているため、このタイプの操作を実行することはできません。あなたは文字エンコーディングを仮定する必要があります(私はあなたの疑問にアスキーを想定していると思います)、またはJavaプラットフォームの文字エンコーディングを使用する必要があります。つまり、少なくとも文字配列に変換する必要がありますいくつかのCharset。

ここでの問題は、Javaのcharは2バイトであり、1バイトで作業すると考えていることです。とにかく、あなたが本当にこれを行い、提供されているツールを使用したくないのであれば、オープンソースツールを書いている一般的な人がツールキットを十分に活用しようとしているので、おそらくあなた自身で書く必要があります。私はそれが疑わしい。

だから、あなたがこれらの独自のバージョンを記述する必要があります、ここでの例です:

public int indexOf(byte[] bytes, String stuff, String encoding) { 
    byte[] pattern = stuff.getBytes(encoding); 
    int startIndex = 0, patternIndex = 0; 
    for(int i = 0; i < bytes.length && patternIndex < pattern.length; i++) { 
     if(pattern[patternIndex] == bytes[i]) { 
      if(patternIndex == 0) startIndex = i; 
      patternIndex++; 
     } else { 
      patternIndex = 0; 
     } 
    } 
    return patternIndex == pattern.length ? startIndex : -1; 
} 

あなたはこのライブラリを試みることができる:http://code.google.com/p/byteseek/

+0

私はこれを手で実装していましたが、しばらくすると疲れました。 indexOf、compare、startsOf、equal、copy ...このユーティリティクラスをどこかで行ってもいいですが、やはりindexOfだけでなくBUNCHメソッドを探しています。 – chrisapotek

+0

私はこれを実現すると認めます。マルチバイト問題に対処する方法を説明するだけでした。あなたの質問について混乱させるのは、文字がindexOf操作で渡された場所で提供されるサンプルコードです。それはあなたがあなたのマッチングをするために文字や文字列の一部を使用していると仮定しました。これが、自分自身をコンバージョンに制限することには意味がありません。しかし、もしあなたがbyte []で一般的に作業していたなら、これは少し意味があります。あなたの意図はすべてうまく説明されていないし、なぜStringへの変換も避けているのですか?私の答えを編集しました。 – chubbsondubs

+0

文字列がガベージを生成します。私はそれを避けるためにすべてをバイト[]として扱います。だから私はネットワークからバイト[]に読み込み、何をする必要があるのか​​を行い、バイト[]としてネットワークに書き込む。ごみは一切作られません。私は知っている、それは吸うが、それは私がする必要があるものです。 – chrisapotek

関連する問題