ByteBuffer в bigdecimal, двоичный, строковый

**Пожалуйста, проверьте редактирование в нижней части этого поста
У меня есть байтовый буфер [128 бит] [который имеет числа], который мне нужно преобразовать в bigdecimal, binary, string, поскольку это соответствующее сопоставление sql при использовании jdbc.

Есть ли библиотечный API, который я могу использовать для этого. Я вижу, что String.valueof() не принимает массив байтов в качестве параметра. Поэтому я вынужден делать что-то вроде этого:

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

Это похоже на взлом для меня ?. Есть ли лучший способ сделать это или, скорее, эффективно выполнить часть jdbc. На данный момент я сосредоточен на вставках в соответствующие столбцы sql.

Редактировать:
Я ошибался, байтовые буферы были не просто числами, а всевозможными битами. Итак, теперь мне нужно взять 128-битный байтовый буфер и преобразовать его в 2 длинных, а затем объединить в bigdecimal, чтобы числа сохраняли свое здравомыслие. Что-то вроде этого: LongBuffer lbUUID = guid.asLongBuffer();

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

BigDecimal = firstLong + secondLong ;

Спасибо.


person codeObserver    schedule 03.12.2010    source источник


Ответы (2)


Может быть, лучше обойти 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);
person Robert    schedule 15.12.2010

Ваша самая большая проблема заключается в том, что String работает ТОЛЬКО с char внутри, поэтому вам нужно будет как-то конвертировать. Чуть более дешевый способ

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

Поскольку у вас есть только цифры, вам не придется беспокоиться о кодировках. К сожалению, это все равно создаст временный объект String.

Единственная альтернатива состоит в том, чтобы проанализировать байтовый буфер вручную (т. е. пройтись по нему, байт за байтом и таким образом инициализировать ваш BigDecimal) — это позволит избежать выделения каких-либо временных объектов, но в конечном итоге вызовет намного больше функций, поэтому вы, вероятно, не не хотите идти по этому пути, если вы действительно не пытаетесь избежать создания этой строки.

Я не знаю больше о контексте вашего приложения, поэтому я не уверен, как именно используется ваш BigDecimal.

person EboMike    schedule 03.12.2010
comment
Thnx, EboMike.. не могли бы вы объяснить, в чем разница между вашим и моим подходом.. Я не вижу, как он отличается внутри.. я думаю, что сначала байтовый буфер преобразуется в символы, а затем он обертывается строковым объектом. .does new String[bigmyBuffer] преобразует байты в строку напрямую или быстрее и т. д.? - person codeObserver; 03.12.2010
comment
В общем, вы хотите избежать создания объектов. В вашем коде вы создаете временный jchararray, и из него вы создаете временную строку (я не уверен, что строка может использовать jchararray для своего внутреннего буфера - возможно). В моем примере вы бы пропустили хотя бы один шаг. - person EboMike; 03.12.2010
comment
Я должен это оговорить - все это имеет значение только в том случае, если вы сделаете их очень много. Если нет, то разница незначительна, и важнее написать понятный и простой в сопровождении код. Опять же, чтобы действительно дать вам более подходящий ответ, мне нужно больше контекста о том, как все это используется. - person EboMike; 03.12.2010
comment
Мой подход вызывает ошибку времени выполнения [java.lang.NumberFormatException], а ваш не компилируется [класс строк не принимает байтовый буфер в качестве аргумента конструктора]. - person codeObserver; 04.12.2010
comment
Что я делаю, так это вставляю этот байтовый буфер в числовой столбец в базе данных. И я делаю кучу этих вставок более миллиарда .. это стресс-тест. - person codeObserver; 04.12.2010
comment
О, подождите, у вас есть ByteBuffer, а не массив байтов? Извините, я неправильно это истолковал. Каков возможный диапазон значений для ваших целых чисел? - person EboMike; 04.12.2010
comment
Я добавил правку. Оказывается, биты в byteBuffer не все числовые, поэтому мне нужно сначала преобразовать их в числовые, например long. - person codeObserver; 04.12.2010
comment
Что именно находится в байтбуфере? Если это необработанные двоичные данные, вы можете использовать BigDecimal(byteBuffer.array()), а затем добавить эти два BigDecimals с помощью add(). - person EboMike; 04.12.2010
comment
что вы имеете в виду, когда говорите, что эти два .. (byteBuffer.array()) просто вернут байтовый массив; также нет конструктора для BigDecimal, который принимает bytearray в качестве параметра. Также есть ли стандартная реализация add(), о которой вы упоминаете? - person codeObserver; 05.12.2010