Java ByteBuffer到bigdecimal、二进制、字符串

Java ByteBuffer到bigdecimal、二进制、字符串,java,oracle,jdbc,bigdecimal,Java,Oracle,Jdbc,Bigdecimal,**请检查此帖子底部的编辑 我有一个bytebuffer[128位][它有数字],我需要将其转换为bigdecimal、binary和string,因为这些是使用jdbc时对应的sql映射 是否有一个库API,我可以利用它来做到这一点。我看到String.valueof()没有将字节数组作为参数。所以我一直坚持这样做: BigDecimal bd = new BigDecimal(bigmyBuffer.asCharBuffer().toString()); 这对我来说像是一个黑客?。有没有更

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

是否有一个库API,我可以利用它来做到这一点。我看到String.valueof()没有将字节数组作为参数。所以我一直坚持这样做:

BigDecimal bd = new BigDecimal(bigmyBuffer.asCharBuffer().toString());
这对我来说像是一个黑客?。有没有更好的方法来实现这一点,或者更确切地说是以一种高效的方式实现jdbc部分。我现在的重点是在各自的sql列中进行插入

编辑:
我错了,bytebuffers不仅仅是数字,而是各种各样的比特。现在我需要把128位字节的缓冲区转换成2个long,然后合并成一个bigdecimal,这样数字就可以保持正常。比如说: LongBuffer lbUUID=guid.asLongBuffer()


谢谢。

您最大的障碍是
String
仅在内部使用
char
进行操作,因此您需要以某种方式进行转换。稍微便宜一点的方法是

BigDecimal bd = new BigDecimal(new String[bigmyBuffer]);
因为您只有数字,所以不必担心这里的字符集。不幸的是,这仍然会创建一个临时字符串对象

唯一的替代方法是手动解析字节缓冲区(即逐字节遍历它,并以此方式初始化BigDecimal)——这将避免分配任何临时对象,但最终会导致更多的函数调用,因此除非您真的试图避免创建该字符串,否则您可能不想执行该路径


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

可以绕道一下吗?使用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);

迈克。。你能解释一下你和我的方法有什么不同吗。。我看不出它内部有什么不同。。我认为第一个字节缓冲区被转换成字符,然后被字符串对象包装。新字符串[bigmyBuffer]是直接将字节转换成字符串还是更快?一般来说,您希望避免创建对象。在代码中,您创建了一个临时jchararray,并从中创建了一个临时字符串(我不确定该字符串是否能够在内部将jchararray用作其缓冲区—它可能会)。在我的例子中,你至少应该跳过一个步骤。我应该限定这一点——所有这些只有在你做了大量这些之后才有意义。如果不是的话,差别很小,更重要的是编写易于理解和维护的代码。同样,为了给你一个更合适的答案,我需要更多关于如何使用所有这些的上下文。我的方法认为存在运行时错误[java.lang.NumberFormatException],而你的方法不会编译[string类不接受bytebuffer作为构造函数参数]。我正在做的是将这个bytebuffer插入数据库的数值列中。我正在做一大堆超过十亿的插入物这是一个压力测试。
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);