1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/darks-darks-codec

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Darks Codec

Darks codec — это облегчённый фреймворк для кодирования и декодирования сообщений в рамках протокола. Он поддерживает кодирование и декодирование объектов сообщений большинства протоколов на основе байтов.

Он помогает разработчикам легко и быстро создавать любой протокол обмена сообщениями. А также помогает решить проблему с пакетами, которые «зависают» в сети или теряются.

Это позволяет разработчикам уделять больше внимания проектированию, а не реализации протокола обмена сообщениями, что может улучшить дизайн программного обеспечения.

Простой пример

Определение структуры сообщения

Если мы хотим создать протокол обмена сообщениями с прямым порядком байтов, например:

  FB FA  [ID 32bits] [VERSION 8bits] [COMMAND]  FF

Мы можем создать класс JAVA, например:

  public class SimpleMsg
  {
      int id;
      byte version;
      String command;
  }

Для простоты мы опускаем методы get/set.

Настройка кодера объектов

Согласно протоколу обмена сообщениями нам нужны только идентификаторы начала и конца («FB FA» и «FF») помимо тела сообщения, поэтому мы можем настроить кодер объектов следующим образом:

  ObjectCoder coder = new ObjectCoder();
  coder.getCodecConfig().setEndianType(EndianType.LITTLE);
  coder.getCodecConfig().addWrap(new IdentifyWrapper(new OCInt16(0xFAFB), new OCInt8(0xFF)));

Кодирование сообщения

Теперь мы можем легко закодировать объект сообщения.

  SimpleMsg msg = new SimpleMsg();
  msg.id = 32;
  msg.version = 1;  
  msg.command = "running";
  byte[] bytes = coder.encode(msg);
  System.out.println(ByteHelper.toHexString(bytes));

Код выведет информацию в консоль:

  FB FA   20 00 00 00   01   72 75 6E 6E 69 6N 67   FF

Из-за прямого порядка байтов 0xFAFB кодируется как «FB FA», ID, равный 32, кодируется как «20 00 00 00», VERSION, равная 1, кодируется как «01», команда «running» кодируется как «72 75 6E 6N 69 6N 67», а 0xFF кодируется как «FF».

Декодирование сообщения

Теперь попробуем декодировать объект сообщения.

  SimpleMsg result = new SimpleMsg();
  coder.decode(bytes, result);
  System.out.println("ID:" + result.id);
  System.out.println("VERSION:" + result.version);
  System.out.println("COMMAND:" + result.command);

Код выведет информацию в консоль:

  ID:32
  VERSION:1
  COMMAND:running

Общая длина

Некоторым протоколам обмена сообщениями необходимо заменить идентификатор конца на общую длину сообщения в байтах. Мы можем установить тип общей длины, чтобы получить длину объекта в байтах. Тип общей длины имеет значения AUTO, BODY и HEAD_BODY. AUTO: автоматическая общая длина объекта. Она вычисляет длину объекта без учёта длины заголовка или хвоста обёртки, только когда autoLength имеет значение true. BODY: общая длина тела будет вычислять длину объекта и длину хвоста обёртки без учёта длины заголовка обёртки. HEAD_BODY: общая длина заголовка и тела будет вычислять длину заголовка обёртки, длину хвоста обёртки и длину объекта.

  ObjectCoder coder = new ObjectCoder();
  coder.getCodecConfig().setEndianType(EndianType.LITTLE);
  coder.getCodecConfig().setTotalLengthType(TotalLengthType.HEAD_BODY);
  coder.getCodecConfig().addWrap(new IdentifyWrapper(new OCInt16(0xFAFB)));

Код выведет информацию в консоль:

  FB FA   12 00 00 00   20 00 00 00   01   72 75 6N 6N 69 6N 67

Теперь простой пример завершён. Вы можете найти коды в /examples/darks/codec/examples/simple.

Автоматическая длина значений

Если протокол обмена сообщениями содержит множество типов объектов, таких как String, Object, Bytes и т. д., мы должны установить автоматическую длину, чтобы обеспечить правильное декодирование сообщений. Протокол обмена сообщениями может выглядеть так:

  FB FA  [TOTAL LENGTH] [ID 32bits] [VERSION 8bits] [CMD1 LEN 32bits] [COMMAND1] [CMD2 LEN 32bits] [COMMAND2]

Класс Java bean:

  public class MultiCmdMsg
  {
      int id;
      byte version;
      String command1;
      String command2;
  }

Затем мы кодируем его объект с автоматической длиной:

  ObjectCoder coder = new ObjectCoder();
  coder.getCodecConfig().setEndianType(EndianType.LITTLE);
  coder.getCodecConfig().setTotalLengthType(TotalLengthType.HEAD_BODY);
  coder.getCodecConfig().setAutoLength(true);
  coder.getCodecConfig().addWrap(new IdentifyWrapper(new
**OCInt16(0xFAFB)))**

MultiCmdMsg msg = new MultiCmdMsg(); msg.id = 32; msg.version = 1; msg.command1 = "ready"; msg.command2 = "running"; byte[] bytes = coder.encode(msg); System.out.println(ByteHelper.toHexString(bytes));

Будет выведено следующее:

FB FA 1F 00 00 00 20 00 00 00 01 05 00 00 00 ready 07 00 00 00 running

Тип кодека

Помимо использования типа JAVA напрямую, разработчики могут более гибко использовать тип кодека, который находится в пакете darks.codec.type для кодирования.

  • OCInt32: 32-битный целочисленный тип, основанный на OCInteger.
  • OCInt16: 16-битный целочисленный тип, основанный на OCInteger.
  • OCInt8: 8-битный целочисленный тип, основанный на OCInteger.
  • OCLong: 64-битный длинный тип.
  • OCFloat: Аналогично float.
  • OCDouble: Аналогично double.
  • OCBytes: Тип массива байтов.
  • OCString: Аналогично String.
  • OCList: Может хранить данные коллекции, основанные на java.util.List.
  • OCMAP: Может хранить пары ключ-значение, основанные на java.util.Map.
  • OCListMap: Может хранить несколько значений в одном ключевом индексе помимо функции Map.
  • OCObject: Java-объект может расширять его для гибкого кодирования.
  • Custom Type: Разработчики могут создать класс, наследующийся от OCBase или OCBaseType, чтобы настроить тип, который должен добавить аннотацию @CodecType.

Пример типа кодека Мы можем перестроить SimpleMsg с помощью типа кодека.

public class SimpleMsg extends OCObject { OCInt32 id = new OCInt32(); OCInt8 version = new OCInt8(); OCString command = new OCString(); }

Также мы можем перестроить MultiCmdMsg, используя смешанный тип.

public class MultiCmdMsg { int id; byte version; OCInt32 cmdLen1 = new OCInt32(); OCString command1 = new OCString(cmdLen1); OCInt32 cmdLen2 = new OCInt32(); OCString command2 = new OCString(cmdLen2); }

Команда «command1 = new OCString (cmdLen1)» может автоматически установить значение длины команды1 в поле «cmdLen1». И она будет декодировать command1 по значению cmdLen1 при декодировании. Поэтому мы должны установить параметр «autoLength» в false.

ObjectCoder coder = new ObjectCoder(); coder.getCodecConfig().setEndianType(EndianType.LITTLE); coder.getCodecConfig().setTotalLengthType(TotalLengthType.HEAD_BODY); coder.getCodecConfig().setAutoLength(false); //default false. coder.getCodecConfig().addWrap(new IdentifyWrapper(new OCInt16(0xFAFB))); MultiCmdMsg msg = new MultiCmdMsg(); msg.id = 32; msg.version = 1; msg.command1.setValue("ready"); msg.command2.setValue("running"); byte[] bytes = coder.encode(msg); System.out.println(ByteHelper.toHexString(bytes));

Вы можете увидеть подробные примеры кодов в /examples/darks/codec/examples/codectype.

Сложное сообщение

Мы можем попытаться построить несколько вложенных объектов. Протокол сообщений выглядит следующим образом:

FA FB [TOTAL LEN 32 бита] [ID 32 бита] [VERSION 8 бит] [EXTERN LEN 16 бит] [EXTERNAL BYTES] [SUB LEN 32 бита] [#SUB MSG# [CODE LEN 8 бит] [КОД] [МОДУЛЯРНЫЙ 8 бит] [СУБ МОДУЛЯРНЫЙ 8 бит] [#CMDS# [CMD CODE 8 бит] [ДЛИНА КОДА 16 бит] [КОД] ... [CMD CODE 8 бит] [LENGTH КОДА 16 бит] [КОД]]]

Мы можем построить JAVA bean следующим образом:

public class ComplexMsg { int id;

byte version;

OCInt16 externLength = new OCInt16();

OCBytes extern = new OCBytes(externLength);

OCInt32 subMsgLength = new OCInt32();

ComplexSubMsg subMsg = new ComplexSubMsg(subMsgLength);

}

class ComplexSubMsg extends OCObject {

OCInt8 codeLen = new OCInt8();

OCString equipCode = new OCString(codeLen);

byte modular;

byte subModular;

OCMap<Byte, OrderMsg> commands = new OCMap<Byte, OrderMsg>();

public ComplexSubMsg (OCInteger lenType) {
    super(lenType);
}

}

class OrderMsg { OCInt16 orderLength = new OCInt16();

OCBytes order = new OCBytes(orderLength);

public OrderMsg() {
}

public OrderMsg(OCBytes order) {

} Данный текст представляет собой фрагмент программного кода на языке Java.

В тексте описывается процесс создания и обработки объектов, а также использование библиотеки darks-codec для сериализации и десериализации объектов.

Перевести этот текст с учётом всех ограничений не представляется возможным, так как в нём используются специфические термины и конструкции, характерные для языка программирования Java. Однако можно дать общий обзор содержания текста:

  1. В начале описывается создание и настройка объекта ObjectCoder, который используется для кодирования и декодирования данных. Затем создаётся объект ComplexMsg, который содержит различные поля и команды.
  2. Далее приводится пример использования метода encode для преобразования объекта ComplexMsg в последовательность байтов. После этого демонстрируется использование метода decode для восстановления исходного объекта из последовательности байтов.
  3. Затем описывается использование тёмного кодека (darks-codec) для простой сериализации объектов без необходимости реализации интерфейса java.io.Serializable. Приводится пример настройки ObjectCoder и создания объекта SerialMainBean.
  4. Также упоминается возможность использования кэша полей для ускорения процесса получения полей объекта при кодировании и декодировании. Описываются типы кэшей: локальный (LOCAL), глобальный (GLOBAL) и отсутствие кэша (NONE).
  5. Упоминается проблема с порядком полей в объектах на некоторых виртуальных машинах Android, которая может повлиять на процесс сериализации. Спасибо!

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Darks Codec — это легковесная структура для разработки и декодирования коммуникационных протоколов. Она предоставляет разработчикам удобный, быстрый и эффективный способ создания коммуникационных протоколов. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/darks-darks-codec.git
git@api.gitlife.ru:oschina-mirror/darks-darks-codec.git
oschina-mirror
darks-darks-codec
darks-darks-codec
master