Что произойдет, если файл не заканчивается точно на последнем байте? - PullRequest
0 голосов
/ 24 июня 2019

Например, если файл имеет размер 100 бит, он будет сохранен как 13 байтов. Это означает, что первые 4 бита последнего байта - это файл, а последние 4 - не файл (бесполезные данные).

Так как же это предотвратить при чтении файла с помощью функции FileInputStream.read () в Java или аналогичных функций в другом языке программирования?

Ответы [ 2 ]

4 голосов
/ 24 июня 2019

Вы заметите, что если вы когда-либо используете ассемблер, на самом деле нет способа прочитать конкретный бит.Наименьший адресуемый бит памяти - это байт, адреса памяти относятся к определенному байту в памяти.Если вы когда-либо используете определенный бит, чтобы получить к нему доступ, вы должны использовать побитовые функции, такие как | & ^ Так что в этой ситуации, если вы храните 100 бит в двоичном виде, вы на самом деле храните минимум 13 байтов и несколькобиты по умолчанию равны 0, поэтому результаты одинаковы.

0 голосов
/ 25 июня 2019

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

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

В тех случаях, когда файл должен содержать нецелое числобайты могут (и должны) делать свои собственные меры.Возможно, 100-битный регистр мог бы вставить заголовок, который фактически говорит о том, что только первые 100 бит из следующих 13 байтов содержат полезные данные.Это, конечно, потребует особой обработки, либо в приложении, либо в какой-либо библиотеке, которая обрабатывает данные такого типа.и т. д., кажется, я упускаю суть.Конечно, детализация дискового хранилища не является проблемой: мы можем хранить «100-байтовый» файл на устройстве, которое может обрабатывать только блоки размером 256 байт - все, что нужно, чтобы файловая система заметила, что размер файла составляет 100, а не 256,хотя 256 байтов выделены для файла.С таким же успехом можно было бы отследить, что размер был 100 бит, если бы это было полезно.И, конечно, нам потребуются системные вызовы ввода / вывода, которые выражают длину передачи в битах.Но это не сложно.Буфер в памяти должен был бы быть немного больше, потому что ни язык, ни ОС не выделяют оперативную память в произвольных битах, но это не привязано к размеру файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...