2009-08-24 11 views
1

私はbyte []に​​変換したいjavaのint []を持っています。新しいオブジェクトを作成せずにint []をbyte []に​​変換する

これを行う通常の方法は、int配列のサイズの4倍の新しいbyte []を作成し、すべてのintを1バイトずつ新しいバイト配列にコピーすることです。

しかし、これを行う唯一の理由は、javaの型安全ルールのためです。 int配列はすでにバイト配列です。そのjavaでは、int []をbyte []に​​キャストし、それをbyte []として使用することはできません。

多分、jniを使ってint型配列をJavaのバイト配列のように見せることはできますか?

+0

、なぜあなたはこれを実行する必要がありますか? – Adamski

+1

パフォーマンスの理由 – pdeva

+1

これは重要なパフォーマンス上の問題であれば、別の言語を使用する方がよい場合があります。 – izb

答えて

8

いいえネイティブJavaアレイインターフェイスでオブジェクトを実装する機能はありません。

あなたのint []をラップしたいオブジェクトが欲しいのですが、それをバイト配列型の方法でアクセスするための現在のメソッドです。例えば

public class ByteArrayWrapper { 
    private int[] array; 

    public int getLength() { 
     return array.length * 4; 
    } 

    public byte get(final int index) { 
     // index into the array here, find the int, and then the appropriate byte 
     // via mod/div/shift type operations.... 
    int val = array[index/4]; 
    return (byte)(val >> (8 * (index % 4))); 
    } 
} 

(上記などのコンパイル/テストされ、あなたのバイト順序の要件に依存している。それは純粋に説明ですされていません)

+0

完全なbyte []インターフェイスを提供するクラスを定義することは可能ではないと思います。これには、インデックス付けやbyte []が必要な場所への渡しが含まれます。だから私はOPがコピーを作成しなければならない可能性が高いと思う。 –

+0

Martinが正しいです。このクラスは、byte []を渡す必要がある場合には使用できません。 – pdeva

+2

@pdeva - 上記のとおりです。だからこそ、私の答えは「いいえ」です:-)私は* Martin *のコメントの後、この問題をさらに強調しました。私は「いいえ」と答えるだけでなく、どれほど明確に私ができるかもわかりません。 –

1

あなたは本当に、本当に、あなたに外部コールを使用することができなければならなかった場合これを行うにはC言語が、私はそれが言語内で行うことはできませんかなり確信しています。

私はまた、既存のコードがどのように見えているか、どれくらいのスピードを期待しているのか、本当に興味があります。

あなたは最適化のルールを知っていますか?

  • 1)最適化しないでください。
  • 2)あなたが専門家であれば、あなたは専門家であれば、可能な明確なコードを書かれている1.
  • 3)ルールを参照し、その後、失敗しているテストのタイミングがあります。最適化された書き込み)
  • 3aにあなたの最適化されたコードが速度テストに合格しなかった場合、復帰してください。
  • 3c)なぜこのようにコメントしたのかを正確に説明してください。速度測定値と要件への参照を含めてください。
  • 3D)ルール3は、あなたの正確な要件に応じてルール1
+0

マイナス?本当に? Cの呼び出しを使ってそれをマップすることはできませんでした(同じメモリ空間への新しいポインタを作成して返します)か、誰かが最適化しないという重要性を理解していないからです。 –

+0

それは話題から外れていると思いますか?私は確かにそれを自分のメリットで読むことを楽しんだ! – spieden

+0

私はこれをアップヴォートするだろうが、私は "最適化されていないコードをコメントとして残す" *に同意しない。バージョン管理システムにブランチを作成することをお勧めします。 – finnw

3

を参照してください、あなたはNIOのjava.nio.ByteBufferクラスを使用することができるかもしれ、あまりにも多くの仕事のように思える場合。最初の割り当てをByteBufferとして行い、int値にアクセスするにはgetIntputIntのメソッドを使用します。バイト単位でバッファにアクセスする必要がある場合は、getおよびputのメソッドを使用できます。 ByteBufferにはasIntBufferメソッドもあり、デフォルトのgetおよびput動作をバイトではなくintに変更します。

JNIを使​​用している場合は、直接割り当てられたByteBuffer(場合によって)がCコードで直接ポインタにアクセスすることを許可します。好奇心のうち

http://java.sun.com/javase/6/docs/api/java/nio/ByteBuffer.html

関連する問題