ByteBuffer为bigdecimal,binary,string

时间:2010-12-03 01:49:21

标签: java oracle jdbc bigdecimal

**请检查此帖子底部的编辑 我有一个bytebuffer [128位] [有数字]我需要转换为bigdecimal,binary,string,因为这些是使用jdbc时相应的sql映射。

我是否可以使用库API来执行此操作。我看到String.valueof()没有将字节数组作为参数。所以我坚持做这样的事情:

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

这看起来像是对我的黑客攻击?有没有更好的方法来做到这一点,或者更有效地做jdbc部分。我现在专注于在相应的sql列中进行插入。

修改
我错了,字节缓冲区不仅仅是数字而是各种各样的位。所以现在我需要取128位字节缓冲区并将其转换为2个long,然后合并为bigdecimal,以便数字保持其理智。所以像这样: LongBuffer lbUUID = guid.asLongBuffer();

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

BigDecimal = firstLong + secondLong ;

感谢。

2 个答案:

答案 0 :(得分:1)

绕道BigInteger可能会更好吗?使用BigInteger可以将字节数组解释为正数大数,而从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);

答案 1 :(得分:0)

您最大的障碍是String仅在内部使用char,因此您需要以某种方式进行转换。

是一种稍微便宜的方式
BigDecimal bd = new BigDecimal(new String[bigmyBuffer]);

由于您只有数字,因此您不必担心这里的字符集。不幸的是,这仍然会创建一个临时的String对象。

唯一的选择是手动解析字节缓冲区(即逐个字节地执行它,并以这种方式初始化BigDecimal) - 这将避免分配任何临时对象,但最终会产生更多的函数调用,所以除非你真的想避免创建那个String,否则你可能不想走那条路。

我不太了解您的应用程序的上下文,所以我不确定您的BigDecimal是如何使用的。