Байтовые (или битовые) последовательности в Java и Kotlin - PullRequest
0 голосов
/ 06 апреля 2019

Существует ли канонический способ определения структуры данных в Java (и с помощью расширения Kotlin), которую можно сериализовать в байтовый массив или последовательность битов в порядке, в котором байты определены в структуре?

Похоже на Struct в C.

Редактировать: Итак, в дополнение к этому, я бы хотел простой и выразительный способ определения структуры данных и последующего доступа к любой ее части.Так, например, в псевдокоде:

DataStructure Message {
    Bit newFlag;
    Bit genderFlag;
    Bit sizeFlag;
    Bit activeFlag;
    Bit[4] operation;
    Byte messageSize;
    Byte[] message; 
}

Итак, мы делаем:

Message firstMessage = new Message(1, 0, 1, 0, b'0010', 11, "Hello there");

И мы можем сказать:

ByteArray serialisedMessage = firstMessage.toBytes();

Что даст наммассив, который выглядел так:

[b'10100010', b'00001011', "Hello there" (but in bytes)]

Тогда мы могли бы сделать:

firstMessage.genderFlag = 1;

.. и просто повторно запустить .toBytes для объекта.

Очевидно, есть миллионспособы выполнения таких вещей , как это в Java, но ничего синтаксически простого, насколько я вижу, - практически все, что связано с необходимостью писать собственный метод сериализации (а не сериализации объектов в соответствии с Java) для каждогообъект.Возможно, это канонический способ сделать это, но было бы неплохо сделать это проще, в соответствии с C, Rust и, конечно, COBOL.

1 Ответ

0 голосов
/ 06 апреля 2019

Я не знаю ответа на ваш актуальный вопрос.

Я, однако, предложу одну или две мысли о природе самого вопроса.C не был разработан как язык высокого уровня - лучшее описание, которое я слышал, это «структурированный ассемблер», в нем есть операторы, основанные на режимах адресации, доступных на 16-битных машинах, на которых он был впервые разработан.и не был разработан как стандарт для использования в приложениях, но как нечто (намного) более простое, чем ассемблер, которое все же позволяло программисту иметь достаточный контроль для написания очень эффективного кода.Первые две вещи, которые были сделаны с ним, были компилятор и операционная система, поэтому эффективность времени выполнения была жизненно важна (в начале 70-х годов) таким образом, что никто, кроме разработчиков мобильных и встраиваемых систем, не может начать ценить в наши дни.

«Порядок определения байтов в структуре», на мой взгляд, не очень хороший способ думать о данных в Java - программист не знает или не заботится о порядке, в котором хранятся поля в его объектах, или нетони хранятся вообще - это не является частью определения языка.Мне кажется, что любая библиотека или что-либо, что, как утверждается, должно было сделать это, должно было бы добавить отказ от ответственности и / или иметь свой собственный компилятор;хотя я не знаю ни одной причины, по которой он не мог этого сделать и следовал спецификации Java, я не знаю, почему кто-то будет беспокоиться.

Так что спросите себя, почему вы хотите это сделать.И если у вас есть хороший ответ, поместите его здесь;Мне было бы любопытно.

...