Очень конкретный вопрос, но у нас здесь есть несколько хороших ада, поэтому я хотел бы услышать мысли Я читаю данные из файла, используемого для встроенных систем. У блоков данных, с которыми я работаю, всегда есть предсказуемый формат заголовка ... но есть одна проблема ... длина полезной нагрузки данных указывается как часть формата непосредственно перед тем, как полезная нагрузка возникает. Поэтому я не знаю размер полезной нагрузки, пока не прочитаю определенный байт в известной позиции в заголовке. Куски происходят один за другим.
Буквально формат ([] используется для удобства чтения) :
[ 2-байтовая TAG ] [ 1-байтовая длина полезной нагрузки (LSB) ] [ 1-байтовая длина полезной нагрузки (MSB) ] [ PAYLOAD ]
Полезная нагрузка - это читаемый человеком текст конфигурации. Следующим тегом будут следующие два байта после предыдущей полезной нагрузки и так далее, пока я не увижу совпадения с известным тегом после последней полезной нагрузки. Тогда я знаю, что я закончил.
Я читаю это из файла, используя поток direct_IO, но я мог бы переключиться на более общий поток и просто начать выполнять преобразования.
Я бы хотел сохранить все это в простой записи в конце дня
Я ищу метод, в котором я могу читать данные и читать 3-й байт. Теперь я знаю размер полезной нагрузки и могу измерить размер массива или компонента String для правильного хранения данных в тот момент, когда запись уже действует как чтение. буфер. То есть мне нужно прочитать данные TAG и длины, поэтому я хотел бы сразу сохранить их в записи. Я хочу сохранить полезную нагрузку в той же записи, если смогу. Я мог бы рассмотреть возможность использования типа доступа и динамического создания хранилища полезных данных, но это означает, что я должен остановить чтение после 3 байтов, выполнить работу и затем продолжить. Кроме того, это означает, что запись будет иметь ту же проблему, поскольку представление объекта больше не соответствует ожидаемому формату фрагмента.
Я думал о попытке использовать запись для хранения всего этого с дискриминантом для размера полезной нагрузки и использовать условие представления для этой записи, чтобы имитировать точный вышеописанный формат. Поскольку дискриминант является третьим байтом как в записи, так и во фрагменте данных, я мог бы вести диалог и просто «укладывать» данные в объект… но у меня нет способа измерить компонент, когда я создаю экземпляр запись без уже прочитанного тега и длины. Я предполагаю, что не могу прочитать И создать объект одновременно, поэтому для создания объекта мне нужна длина. Хотя я мог бы продолжать играть с позицией файла и читать то, что мне нужно, затем вернуться к началу, а затем создать и использовать весь кусок, который, как я знаю, должен быть лучше «Ады».
Есть ли способ, с помощью которого я могу использовать условие представления, чтобы заполнить заголовок в записи, а когда дискриминант заполнен значением из данных, будет установлен размер массива записей или компонента String Payload?
Кроме того, это не только для чтения, мне нужно найти хороший способ вывода этого точного формата в файл при изменении конфигурации. Поэтому я надеялся использовать предложение представления, чтобы соответствовать базовому формату, чтобы я мог буквально «записать» объект в файл, и это был бы правильный формат. Я надеялся сделать то же самое для чтения.
Все примеры чтения Ada, которые я до сих пор видел, с записями известной длины (или известной максимальной длины), где запись читается в блоке данных статического размера.
Есть ли у кого-нибудь пример или может указать мне правильное направление, как я мог бы использовать этот подход при работе с этой полезной нагрузкой переменного размера?
Спасибо за любую помощь, вы можете предоставить,
-Josh