У меня есть отношение, где для каждой записи есть столбец BYTEA (UTF-8), кодирующий 3 числа в следующем порядке:

Байты 0-1: номер 1

Байты 2-3: номер 2

Байты 4-6: номер 3

Как я могу разобрать двоичные данные в читаемые числа?

В настоящее время у меня есть это и не знаю, как продолжить:

Class.forName(dbDriver);
Connection connection = DriverManager.getConnection(dbUrl, dbUser, dbPass);
Statement st = connection.createStatement();
String query = "SELECT ...";
ResultSet rs = st.executeQuery(query);
while (rs.next()) {
    byte[] data = rs.getBytes(1);
    //TODO Parse
}

Спасибо

1
michael 28 Май 2017 в 15:16

2 ответа

Лучший ответ

Это зависит от того, как хранятся цифры.
Они двоичные?
Подписаны ли они ?
Являются ли они большими или маленькими порядковыми номерами?

Предполагая да для первых двух, вы можете использовать битовую манипуляцию, например,

// Little-endian
short num1 = (short) ((data[0] & 0xFF) | (data[1] & 0xFF) << 8);

// Big-endian
short num1 = (short) ((data[0] & 0xFF) << 8 | (data[1] & 0xFF));

Но, вероятно, проще использовать ByteBuffer :

ByteBuffer buf = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN);
short num1 = buf.getShort();
short num2 = buf.getShort();
short num3 = buf.getShort();

ByteBuffer по умолчанию BIG_ENDIAN.

2
Andreas 28 Май 2017 в 12:31

Можете ли вы попробовать это:

Для строки:

    String tatto = "my tatto"; //for example
    byte[] array = tatto.getBytes(); // Or any bytes
    String s = new String(array);
    System.out.println(s);

Для байта []:

    byte[] data = new byte[]{ 1, 16, 84, 2, 101, 110, 83, 111};
    long val = 0;
    for (int i = 0; i < data.length; i++)
    {
       val = (val << 8) + (data[i] & 0xff);
    }
    System.out.println(val);
0
Coder ACJHP 28 Май 2017 в 13:01