#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 байт как векторный массив)