Преобразование class в массив byte []

207
02 сентября 2021, 00:10

При работе через Bluetooth получаю ответ от оборудования по сокету в формате массива byte[] buffer.

Этот ответ физически представляет собой запись данных разной длины (byte, short, int).

Для дальнейшей работы с данными есть класс:

public static class opstate  {
    // 1-4 RG
    byte actuator;
    byte logical;
    byte physical;
    byte optionsPart1_ActChannell;
    byte fault1623;
    byte notReady;
    byte fault0007;
    byte fault0815;
    // 5 RG
    byte torqPercent;                   //  процент момента (знаковое число 1 байт)
    byte openPercent;                   //  процент открытия арматуры (беззнаковое число 1 байт)
    // 6-7
    int absPositionCode;                //  Код положения привода (беззнаковое число 8 байтов).
    //8-9
    int relPositionCode;                //  Относительный код положения привода.
    //10
    short absTorqCode;                    // Код момента.Беззнаковое число размером 2 байта.
    //11
    short relTorqCode;    
}

Есть ли способ корректно преобразовать экземпляр такого класса в формат массива byte[] для передачи его в устройство и наоборот, декодировать нужные данные из массива byte[] при условии что в массиве они лежат в том же порядке что и записаны в классе?

Answer 1

Это же элементарно Ватсон:

Объект в массив byte:

public byte[] obj2Byte(Object myObject) throws IOException {
    ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
    ObjectOutputStream objStream = new ObjectOutputStream(byteStream);
    objStream.writeObject(myObject);
    return byteStream.toByteArray();
}

Массив byte в объект:

public Object byte2Obj(byte[] bytes) throws IOException {
    ByteArrayInputStream byteStream = new ByteArrayInputStream(bytes);
    ObjectInputStream objStream = new ObjectInputStream(byteStream);
    return objStream.readObject();
}
Answer 2

Есть ли способ корректно преобразовать экземпляр такого класса в формат массива byte[] для передачи его в устройство и наоборот, декодировать нужные данные из массива byte[] при условии что в массиве они лежат в том же порядке что и записаны в классе?

Да есть способ.
Если ваш формат кастомный. Написать самому encode\decode
Если ваш формат общепринятый - могут быть компиляторы классов, которые по схеме данных автоматически напишут всю логику перевода byte[] в класс и обратно.

Answer 3

Сериализация и правда работает, но она очень много создает служебной информации в массиве так что нашел метод который работает с чистыми значениями в массиве - ByteBuffer и его методы getShort() и getInt().

READ ALSO
Проверка файла на наличие определенных строк во время сборки

Проверка файла на наличие определенных строк во время сборки

Требуется проверять файл xml на наличие определенных значений свойстваДумал сделать через antrun plugin и shell скрипт

228
Как корректно сохранить цветной текст в файл?

Как корректно сохранить цветной текст в файл?

Есть методы изменения цвета выделенного текста

204
Как изменить текст textView из другого класса?

Как изменить текст textView из другого класса?

У меня есть два класса, один класс MainActivity, а другой собственный классМой активити класс содержит textView

283
Проблемы с запуском процедуры из JDBC

Проблемы с запуском процедуры из JDBC

Есть такая процедура, она работает из консоли, когда я ввожу call products_count(null) - она работает

490