2010-12-03 6 views
3

** S'il vous plaît vérifier la modifier au bas de ce post
J'ai un ByteBuffer [128 bits] [qui a] numéros que je dois convertir en BIGDECIMAL, binaire, chaîne puisque ceux-ci sont le mappage sql correspondant lors de l'utilisation de jdbc.ByteBuffer à BIGDECIMAL, binaire, chaîne

Y a-t-il une API de bibliothèque que je peux utiliser pour faire cela. Je vois String.valueOf() ne prend pas un tableau d'octets en tant que parameter.So je suis coincé à faire quelque chose comme ceci:

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

Cela ressemble à un hack pour moi?. Existe-t-il une meilleure façon de le faire ou plutôt de faire la partie jdbc de manière efficace. Je suis concentré sur faire des insertions dans les colonnes sql respectives à partir de maintenant.

Edit:
J'ai eu tort, les bytebuffers étaient pas seulement des chiffres, mais toutes sortes de bits. Alors maintenant, je dois prendre le tampon octet 128 bits et le convertir en 2 longs, puis fusionner en un bigdecimal afin que les chiffres conservent leur santé mentale. Donc, quelque chose comme ça: LongBuffer lbUUID = guid.asLongBuffer();

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

BigDecimal = firstLong + secondLong ; 

Merci.

Répondre

0

Votre plus grand obstacle est que String fonctionne UNIQUEMENT avec char en interne, vous aurez donc besoin de convertir en quelque sorte. Un moyen un peu moins cher est

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

Puisque vous avez seulement des chiffres, vous n'aurez pas à vous soucier des jeux de caractères ici. Malheureusement, cela crée toujours un objet String temporaire. La seule alternative est d'analyser manuellement le tampon d'octets (c'est-à-dire de le parcourir, octet par octet et d'initialiser votre BigDecimal de cette façon), ce qui évite d'allouer des objets temporaires, mais se termine par beaucoup plus d'appels de fonction. donc vous ne voulez probablement pas suivre cette route à moins que vous n'essayiez vraiment d'éviter de créer cette chaîne.

Je ne sais pas plus sur le contexte de votre application, donc je ne sais pas exactement comment votre BigDecimal est utilisé.

+0

Thnx EboMike .. pouvez-vous s'il vous plaît expliquer quelle est la diff dans votre approche et mon .. Je n'arrive pas à voir comment il diffère en interne .. ce que je pense est premier octet tampon est converti en chars et puis il est enveloppé par l'objet chaîne ..does new String [bigmyBuffer] convertit octets en chaîne directement ou est-ce plus rapide etc? – codeObserver

+0

En général, vous voulez éviter de créer des objets. Dans votre code, vous créez un jchararray temporaire, et à partir de là vous créez une chaîne temporaire (je ne suis pas sûr si la chaîne est capable d'utiliser le jchararray pour son buffer en interne - cela pourrait être le cas). Dans mon exemple, vous devez au moins sauter une étape. – EboMike

+0

Je devrais qualifier cela - tout cela n'a d'importance que si vous en faites un tour. Sinon, la différence est minuscule, et il est plus important d'écrire du code compréhensible et facile à maintenir. Encore une fois, pour vraiment vous donner une réponse plus appropriée, j'aurais besoin de plus de contexte sur la façon dont tout cela est utilisé. – EboMike

1

Peut-il être préférable de faire un détour par BigInteger? En utilisant BigInteger vous pouvez interprétons un tableau d'octets comme nombre positif important et de BigInteger il est un très petit à 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);