Как я могу получить доступ к двоичному формату файла?

#architecture #binary #organization #binary-data

#архитектура #двоичный #организация #двоичные данные

Вопрос:

Я только что закончил курс компьютерной организации, на котором мы узнали, что все файлы и данные хранятся в виде 0 и 1 (бит). Однако мне любопытно, как программист может фактически получить доступ к двоичному представлению файла? То есть, как я могу увидеть (или получить доступ) значения 0 и 1, которые представляют любой файл на моем компьютере?

Комментарии:

1. Предпочтительно Java. Я просто хочу иметь возможность «видеть» или получать доступ к байтам файла. Это то, чему нас учат в школе, но я хочу видеть фактические единицы и 0 любого файла (например, txt-файла или exe-файла на моем компьютере).

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

Ответ №1:

Хотя верно, что на самом базовом уровне все хранится в виде битов, большинство процессоров в наши дни позволяют вам обращаться только к байтам (8-битным блокам). Однако по байту можно определить, равен ли бит единице или нет.

Чтобы получить значение бита в позиции pos (от младшего значащего бита, 0, до старшего значащего бита, 7) байта byte , вы могли бы использовать этот код (здесь на C, но он, вероятно, действителен на многих языках):

 // bit here is likely 32 bits, but it will only contain 0 or 1,
// based on the value of the bit at pos in byte
int bit=(byte>>pos)amp;1;
  

Комментарии:

1. Но как я могу получить доступ к байту? Кроме того, могу ли я использовать язык Java для этого вместо C? Если я попытаюсь открыть файл с использованием Java (например, текстовый файл), то я смогу проанализировать только фактические данные в файле (например, строки символов) … но как мне проанализировать байты?

2. @whistler: Просто прочитайте байты из файла как обычно, используя FileInputStream или что-то еще. Код в моем ответе должен работать, если вы переименуете byte во что-то другое (имя byte зарезервировано в Java).

3. @whistler: О, и чтобы получить все биты из байта, просто используйте метод, который я опубликовал, — цикл pos от 7 до 0 включительно.

Ответ №2:

Вы, конечно, могли бы прочитать файл посимвольно, предполагая Java имеет или обрабатывает символы как неподписанные вы преобразуете байт в целое число — тогда десятичное значение каждого байта будет суммой конкретного байта. Затем вы можете изменить его базу в на представимую двоичную форму:

 String byte = Integer.toBinaryString(integer);
  

Это должно быть в пакете Java java.lang (toBinaryString), и вы можете выполнять цикл до конца файла с любой оберткой stream byte, которую вы пожелаете.

Редактировать:

Чтобы дать представление о вашем вопросе о том, как программисты читают двоичный формат (хотя и на низком уровне)

Я не уверен, как это сделать в Java, хотя в C вы бы создали struct (контейнер переменных) и считывали байты непосредственно в каждый элемент, вы могли бы заранее предположить структуру файла по определенному типу файла (т. Е. Прочитать 4 байта, сделать float, прочитать n байт как векторный массив)