Это должна быть достаточно простая задача, но я не смог ее понять, поскольку я некоторое время находился вне C++.
У меня есть алгоритм шифрования, который я хочу протестировать в звуковом файле. Я хочу разделить этот файл на куски, каждый из которых имеет размер C++ int. Затем я хочу передать эти значения через алгоритм и вставить их в новый зашифрованный файл. Затем мне нужно обратить вспять процесс, чтобы продемонстрировать, что его можно дешифровать, предпочтительно в воспроизводимый аудиофайл.
Я знаю, как обрабатывать сам алгоритм; это приводит к тому, что данные попадают в объемные куски, что проблема. Как мне это сделать, независимо от типа файла или формата, и только читать до конца файла? Крайне важно, чтобы я также мог видеть, сколько еще данных необходимо для заполнения последнего int, чтобы я мог сохранить это с помощью схемы шифрования для последующего изменения процесса.
Это так же просто, как открытие двоичного ввода и чтение ints до конца файла, даже если данные в файле не являются числовыми?
Чтобы уточнить, я хочу обрабатывать данные так, как если бы они были числовыми, независимо от того, какой файл я просматриваю. В принципе, я хочу иметь возможность вводить имя файла любого формата и получать входной поток, который позволяет мне читать в ints, игнорируя, если данные должны быть числовыми, буквенно-цифровыми или любыми другими видами компьютерных данных.
Вот два способа решения этой проблемы:
Один из способов - получить весь файл в памяти, в векторе int
. Размер вектора можно получить, получив размер файла, добавьте sizeof(int)
а затем разделите sizeof(int)
. Это сделает размер вектора подходящим для всех данных в файле как int
если последние несколько байтов меньше, чем размер int
.
Другой способ - прочитать один int
за раз, пока файл в порядке. Когда последнее чтение не выполняется, вы проверяете std::istream::gcount
если последнему (неудачному) чтению удалось прочитать что-либо.
sizeof(int)
. Например (12 + 4) / 4 = 4, а не 3. Вы должны добавить sizeof(int)-1
.
std::istream::read
иstd::ostream::write
.