У меня есть набор двоичных данных в форме const std::vector<unsigned char>
, и я хочу иметь возможность извлекать из него отдельные поля, такие как 4 байта для целого числа, 1 для логического значения и т. Д. Это должно быть,насколько это возможно, как эффективно, так и просто.например.Он должен иметь возможность читать данные на месте без необходимости их копирования (например, в строку или массив).И он должен иметь возможность читать по одному полю за раз, как анализатор, поскольку куча данных не имеет фиксированного формата.Я уже знаю, как определить, какой тип поля для чтения в каждом случае - проблема заключается в получении полезного интерфейса поверх std::vector
для этого.
Однако я не могу найти простой способполучить эти данные в удобной форме, которая дает мне полезные функции чтения.например.std::basic_istringstream<unsigned char>
дает мне интерфейс для чтения, но мне кажется, что сначала мне нужно скопировать данные во временную std::basic_string<unsigned char>
, что не подходит для больших блоков данных.
Может быть, есть какой-то способ, которым я могув этом случае используйте streambuf для чтения данных на месте, но для этого мне нужно было бы получить собственный класс streambuf. * 1009 *
Мне кажется, что я могу простоиспользуйте sscanf для данных вектора (), и это может показаться более кратким и более эффективным, чем альтернативы стандартной библиотеке C ++. РЕДАКТИРОВАТЬ: напомнив, что sscanf не делает то, что я ошибочно думал,на самом деле не знаю чистый способ сделать это на C или C ++.Но я что-то упустил, и если да, то что?