将ByteBuffer转换为BigDecimal、二进制和字符串

4

请查看此帖子底部的编辑
我有一个128位的字节缓冲区[其中包含数字],我需要将其转换为BigDecimal、二进制和字符串,因为这些是在使用JDBC时相应的SQL映射。

是否有库API可以帮助我完成这个任务。我发现String.valueof()不接受字节数组作为参数。所以我只能做类似于这样的事情:

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

这看起来像是一个黑客攻击。有没有更好的方法来进行这项操作或者更高效地进行jdbc操作。我现在专注于将数据插入到相应的sql列中。

编辑:
我错了,bytebuffers不仅仅是数字,而是各种位。所以现在我需要将128位字节缓冲区转换为2个longs,然后合并为一个BigDecimal,以保持数字的完整性。所以类似这样的操作: LongBuffer lbUUID = guid.asLongBuffer();

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

BigDecimal = firstLong + secondLong ;

谢谢。
2个回答

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);

0
你面临的最大难题是 String 只能在内部使用 char,因此你需要进行某种转换。一种稍微便宜的方法是:
BigDecimal bd = new BigDecimal(new String[bigmyBuffer]);

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

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

我不知道您的应用程序的上下文信息,因此不确定您的BigDecimal如何使用。


谢谢EboMike。你能否解释一下你的方法和我的方法有什么区别?我看不出它们在内部有什么不同。我认为首先将字节缓冲区转换为字符,然后将其包装成字符串对象。new String[bigmyBuffer]是直接将字节转换为字符串还是更快的方法等? - codeObserver
通常情况下,您应该避免创建对象。在您的代码中,您创建了一个临时jchararray,然后从中创建了一个临时字符串(我不确定字符串是否能够在内部使用jchararray作为其缓冲区 - 可能会)。在我的示例中,您至少可以跳过一步。 - EboMike
我的方法会抛出一个运行时错误[java.lang.NumberFormatException],而你的则无法编译[字符串类不接受ByteBuffer作为构造函数参数]。 - codeObserver
我正在将这个字节缓冲区插入到数据库的数字列中。而且我正在进行大量的插入,超过十亿次...这是一个压力测试。 - codeObserver
哦,等等,你有一个ByteBuffer,而不是一个字节数组?抱歉,我误解了。你的整数可能的值范围是什么? - EboMike
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接