Вяз: Поиск числа в байтах - PullRequest
       7

Вяз: Поиск числа в байтах

1 голос
/ 23 сентября 2019

Я пытаюсь найти некоторые exif-данные на изображении.

Поэтому сначала мне нужно найти число 0x45786966 ('Exif' как unsignedInt32) и сохранить смещение.

Следующие два байта должны быть нулями, и после этого порядковый номер в виде unsignedInt16 (0x4d4d или 0x4949), который также должен быть сохранен.

Я могу получить изображение как Bytes с модулем elm/file.Но как мне найти начало 'Exif' и разобрать порядковый номер в этих Bytes?

Я смотрел на loop -пример из elm/bytes, но не до конца понимаюЭто.Сначала он читает длину списка (unsignedInt32), а затем читает побайтно?Как это работает, если я хочу читать unsignedInt32s вместо байтов?

Как установить смещение, чтобы указать, где функции, такие как unsignedInt32, должны читать далее?

1 Ответ

0 голосов
/ 25 сентября 2019

В примере речь идет о структурированных данных с полем известного размера в начале.В вашем случае вы хотите выполнить поиск, поэтому это довольно другая проблема.

Проблема в том, что elm/bytes на самом деле не предназначена для поиска.Если вы можете гарантировать, что искомая часть будет выровнена по байтам, вполне возможно, что это можно сделать, но, учитывая то, что вы сказали, не существует простого способа, поскольку вы не можете выполнять итерации по частям.бит.

Вы должны прочитать значения без выравнивания, а затем вручную найти часть числа, которое вы хотите в этом.Учитывая сложность и неэффективность этого подхода, я бы рекомендовал использовать порты вместо этого варианта использования.

Если вы можете гарантировать, что то, что вы ищете, будет выровнено по байту (или еще лучше, выровнено по длиневашего номера), вы можете декодировать байт за раз, пока не найдете то, что ищете.Невозможно прочитать с заданного смещения, если вы хотите прочитать до определенной точки, вам нужно прочитать и выбросить значения.

Чтобы сделать это, вам нужно настроить циклгде ваше состояние содержит информацию о том, какую ценность вы ищете, вы нашли.На каждом этапе вы проверяете, есть ли у вас все это (успех), у вас есть следующая часть (продолжение), или у вас что-то другое (сбросьте состояние для поиска с самого начала снова).Если вы достигли конца, не найдя его, вы потерпели неудачу.

...