2010-12-03 14 views
3

**この投稿の下にある編集を確認してください
私はbigdecimal、binary、stringに変換する必要のあるバイトバッファ[128ビット]を持っていますjdbcを使用しているときに対応するsqlマッピングです。ByteBufferからbigdecimal、binary、stringへ

これを行うために私が利用できるライブラリAPIはありますか?

BigDecimal bd = new BigDecimal(bigmyBuffer.asCharBuffer().toString()); 

これは私にはハックのようになります?私はString.valueofは()parameter.Soとしてバイト配列を取ることはありません。私はこのような何かをやっにもこだわっています参照してください。これを行うより良い方法がありますか、効率的な方法でjdbcの部分を行うことです。私は現在、それぞれのSQL列に挿入を行うことに焦点を当てています。

編集:
は私が間違っていた、たByteBufferがないだけでなく、数字のビットのすべての並べ替えました。だから今私は128ビットのバイトバッファを取る必要があり、2つのlongsに変換して、bigdecimalにマージして、数字が健全性を維持するようにする必要があります。だからこのようなもの: LongBuffer lbUUID = guid.asLongBuffer();

firstLong=  lbUUID.get(); 
secondLong =  lbUUID.get(); 

BigDecimal = firstLong + secondLong ; 

ありがとうございます。

答えて

0

Stringは内部でcharとしか動作しないため、何とか変換する必要があります。少し安い方法は

BigDecimal bd = new BigDecimal(new String[bigmyBuffer]); 

です。数字だけがあるので、ここでは文字セットを心配する必要はありません。残念ながら、これは一時的なStringオブジェクトを作成します。

唯一の方法は、バイトバッファを手動で解析することです(つまり、バイト単位で処理し、BigDecimalをそのように初期化する)。一時的なオブジェクトの割り当てを避けることができますが、実際にそのStringを作成しないようにしない限り、おそらくそのルートに行きたくはありません。

私はあなたのアプリケーションのコンテキストについて詳しくは分かりません。そのため、あなたのBigDecimalがどのくらい正確に使用されているか分かりません。

+0

のthnx EboMike ..あなたは、あなたと私のアプローチで差分が何であるかを説明してくださいすることができます。..私はそれが内部的にどのように違うのか見ていません。最初のバイトバッファがcharsに変換され、それが文字列オブジェクトによってラップされていると思います。新しいString [bigmyBuffer]バイトを文字列に直接変換するか、 – codeObserver

+0

一般に、オブジェクトの作成を避けたいとします。あなたのコードでは、一時的なjchararrayを作成し、それから一時的なStringを作成します(文字列が内部的にバッファーにjchararrayを使用できるかどうかはわかりません)。私の例では、少なくとも1つのステップをスキップします。 – EboMike

+0

私はそれを認定しなければなりません - あなたがこれらの怠惰を行うならば、これはすべて重要です。そうでない場合、その差はごくわずかであり、理解しやすく維持しやすいコードを書くことが重要です。繰り返しますが、もっと適切な答えを実際に与えるために、私はこれがどのように使われているかについてより多くの文脈を必要とします。 – EboMike

1

BigIntegerを迂回する方がよいでしょうか? BigIntegerを使用して、あなたが正の大規模な数としてバイト配列をinterpretateできるとのBigIntegerから、それはBigDecimalのに非常に小さな一歩です:

byte[] data= new byte[] { 0x12, 0x04, 0x07, 0x05, 0x08, 0x11, 0x38, 0x44, 0x77, 0x33}; 
BigInteger bi =new BigInteger(1,data); 
BigDecimal bd = new BigDecimal(bi); 
関連する問題