Проблема надувания байта [] в Java? - PullRequest
2 голосов
/ 06 января 2011

Я столкнулся с проблемой, которую не могу понять. Вот определение проблемы: У меня есть некоторые данные в столбце Blob в среде Db2 / Linux. Blob был записан в DB2 после сжатия байта [] с использованием сжатия JDK (код, выполняющий это, работает в среде Linux). Я пытаюсь написать простую программу, чтобы прочитать некоторые из этих данных, распаковать их (используя JDK) и создать строку из распакованного массива байтов в среде Windows (моя среда разработки). Проблема заключается в том, что после распаковки BLOB-объекта (byte []) длина распакованного массива байтов обычно на 1-3 байта больше ожидаемой. Под ожидаемым я имею в виду, что поля смещения и длины также хранятся в базе данных. Таким образом, в этом случае длина распакованного байтового массива обычно больше, чем длина, хранимая в базе данных, всего на несколько байтов. Поэтому, если я создаю объект String из распакованного массива байтов и создаю другой объект String, используя метод substring (offset, length), используя поля offset и length из базы данных, моя вторая String (та, которую я получил с помощью метода substring) короче.

Примером может быть: запись базы данных содержит большой двоичный объект, смещение: 0, длина: 260 409 после распаковки капли -

 compressedByte[].length  - 71,212
 decompressedByte[].length   - 260,412
 new String(decompressByte[]).length()  - 260,412
 new String(decompressByte[]).subString(0, 260,409).length() - 260409

Для некоторых других входных записей я вижу разницу между 1-3 байтами в длину.

Я в некотором роде озадачен этой проблемой, и мне интересно, если кто-нибудь может предложить какие-либо советы, чтобы я мог сделать больше отладки, чтобы разобраться в этой проблеме. Мне интересно, может ли это быть как-то связано с тем, как байты хранятся / записываются в среде Linux и как они читаются в Windows? Спасибо за вашу помощь.

Ответы [ 2 ]

3 голосов
/ 06 января 2011

Я подозреваю, что кодировка по умолчанию различна для двух систем.

// on the linux box   
byte [] blob = str.getBytes("UTF-8");

// in your code 
String str = new String(blob, "UTF-8");

Или, по крайней мере, выясните, какая кодировка по умолчанию для linux box (обычная UTF-8), и пропустите шаг 1

Действительно хороший пример того, что здесь может происходить, можно найти на Джоэле о программном обеспечении

.
2 голосов
/ 06 января 2011

A String не является общим держателем для байтов. У вас, несомненно, будут разные кодировки символов по умолчанию между вашей средой db2 / Linux и вашей средой Windows, что приведет к разным преобразованиям между байтами и символами.

...