ByteBuffer в bigdecimal, двоичный файл, строку - PullRequest
3 голосов
/ 03 декабря 2010

** Пожалуйста, проверьте изменения в нижней части этого поста
У меня есть bytebuffer [128 бит] [который имеет числа], который мне нужно преобразовать в двоично-двоичную строку, так как это соответствующее отображение SQL при использовании JDBC.

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

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

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

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

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

BigDecimal = firstLong + secondLong ;

Спасибо.

Ответы [ 2 ]

1 голос
/ 15 декабря 2010

Может лучше объехать 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 голосов
/ 03 декабря 2010

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

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

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

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

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

...