Из того, что я понимаю, компилятор создает двоичный файл, состоящий из 1 и 0, который может прочитать процессор. У меня есть бинарный файл, но как мне открыть его, чтобы увидеть 1 и 0, которые там? Текстовый редактор говорит, что не может открыть его ...
PS У меня есть сборочный двоичный файл, который должен быть простым двоичным кодом 1 и 0?
Ответы:
Согласно этому ответу по тиранидам :
Обновить
Согласно этому ответу по Эмилио Bool :
источник
Различные люди ответили на некоторые аспекты запроса, но не на все.
Все файлы на компьютерах хранятся как 1 и 0. Изображения, текстовые файлы, музыка, исполняемые приложения, объектные файлы и т. Д.
Все они 0 и 1. Разница лишь в том, что они интерпретируются по-разному в зависимости от того, что их открывает.
Когда вы просматриваете текстовый файл, используя
cat
, исполняемый файл (cat
в данном случае) читает все 1 и 0 и представляет их вам, преобразовывая их в символы из вашего соответствующего алфавита или языка.Когда вы просматриваете файл, используя программу просмотра изображений, он берет все 1 и 0 и превращает их в изображение, в зависимости от формата файла и некоторой логики, чтобы решить все это.
Скомпилированные бинарные файлы ничем не отличаются, они хранятся как 1 и 0.
Ответ arzyfex дает вам инструменты для просмотра этих файлов по-разному, но чтение файла в двоичном формате работает для любого файла на компьютере, так же как и просмотр его как восьмеричного, или шестнадцатеричного, или даже ASCII, просто не может иметь смысла в каждом из этих форматов.
Если вы хотите понять, что делает исполняемый двоичный файл, вам нужно просмотреть его таким образом, чтобы он показал вам язык ассемблера (как начало), который вы можете сделать, используя:
objdump -d /path/to/binary
который является дизассемблером, он берет двоичный контент и преобразует его обратно в ассемблер (который является языком программирования очень низкого уровня).
objdump
не всегда устанавливается по умолчанию, поэтому может потребоваться установка в зависимости от вашей среды Linux.Некоторое внешнее чтение.
NB: как указывает @Wildcard, важно отметить, что файлы не содержат символов 1 и 0 (как вы видите их на экране), они содержат фактические числовые данные, отдельные биты информации, которые либо включены (1) или выключено (0). Даже это описание является лишь приближением к истине. Ключевым моментом является то, что если вы найдете средство просмотра, которое показывает вам 1 и 0, даже если оно все еще интерпретирует данные из файла, а затем показывает символы ASCII для 0 и 1. Данные хранятся в двоичном формате ( см. ссылку на двоичный номер выше). В вики-записи сообщества Пьера-Оливье эта тема описана более подробно.
источник
cat
, исполняемый файл (cat
в данном случае) читает все 1 и 0 и представляет их вам, преобразовывая их в символы из вашего соответствующего алфавита или язык «.cat
не делает этого; все, чтоcat
нужно, это записать байты в стандартный вывод (если вы не используете «вредные» опции). Терминальная программа (и / или аппаратное обеспечение терминала, если применимо, т.е. его встроенное программное обеспечение) определяет, как визуализировать байты в виде символов, возможно, с помощью драйвера TTY.На низком уровне файл кодируется в виде последовательности нулей и единиц.
Но даже программисты редко бывают там на практике.
Во-первых (и это важнее, чем история с 0 и 1), вы должны понимать, что все, что управляет компьютером, кодируется числами .
Символ закодирован числом, используя таблицы набора символов. Например, буква «A» имеет значение 65 при кодировании с использованием ASCII. Смотрите http://www.asciitable.com
Пиксель кодируется одним или несколькими числами (существует много графических форматов). Например, в стандартном трехцветном формате желтый пиксель кодируется как: 255 для красного, 255 для зеленого, 0 для синего. См. Http://www.quackit.com/css/css_color_codes.cfm (выберите цвет и посмотрите ячейки R, G & B)
Бинарный исполняемый файл написан на ассемблере; каждая инструкция по сборке кодируется как числа. Например, инструкция по сборке
MOVB $0x61,%al
кодируется двумя числами: 176,97 См. Http://www.sparksandflames.com/files/x86InstructionChart.html (Каждая инструкция имеет связанный номер от 00 до FF, поскольку используется шестнадцатеричная запись, Смотри ниже)Во-вторых : каждое число может иметь несколько представлений или обозначений .
Скажем, у меня есть 23 яблока.
Но я также могу сделать группы из 16 яблок. Так что я возьму одну Группу из 16 и 7 одиноких яблок. В шестнадцатеричной записи (это то, что называется 16 основанием), я напишу: 17 (16 + 7). Чтобы отличить десятичную запись, обычно используют шестнадцатеричную запись с префиксом или суффиксом: 17h, # 17 или $ 17. Но как изобразить более 9 групп из 16 или более из 9 одних яблок? Просто мы используем буквы от A (10) до F (15). Число 31 (как в 31 яблоках) написано как # 1F в шестнадцатеричном формате.
На этой же линии мы можем сделать группу из двух яблок. (И группа из двух яблок группы из двух, то есть группы яблок 2х2 и т. Д.). Тогда 23: 1 группа из 2x2x2x2 яблок, 0 группа из 2x2x2 яблок, 1 группа из 2x2 яблок, 1 группа из 2 яблок и 1 одинокое яблоко, которое будет отмечено 10111 в двоичном виде.
(См. Https://en.wikipedia.org/wiki/Radix )
Физически механизмы, допускающие два состояния (переключатели), просты в выполнении, также как и на диске, который находится в памяти.
Вот почему данные и программы, представленные в виде чисел, пишутся и обрабатываются в двоичном виде.
Затем переводится - в зависимости от типа данных - в соответствующую форму (буква A, желтый пиксель) или исполняется (инструкция MOV).
hexdump
перечисляет числа, кодирующие данные (или программу сборки) в шестнадцатеричной форме. Затем вы можете использовать калькулятор, чтобы получить соответствующую двоичную форму.источник
Я бы начал с
od
(восьмеричного дампа) и в зависимости от системы может найти такие инструменты, какobjdump
полезные.источник
Вы можете открыть его в шестнадцатеричном редакторе, который показывает его как последовательность шестнадцатеричных значений.
xxd file
Что вы пытаетесь достичь?
источник
bvi
бинарный редактор VIsual с привязками клавиш vim Это доступно на большинстве систем Linux.источник
Команда Linux strings печатает строки печатаемых символов в файлах, например:
и т.д ... это более читабельно, чем двоичный файл
источник
strings
команда удалит большинство байтов, которые он хочет видеть.strings
команда - особенно более длинная, напримерstrings -n 6
- действительно помогает выяснить, что в ней содержится в двоичном файле, если он содержит строковые константы и т. д. Этот ответ должен был быть комментарием, а затем было хорошо.strings
полезность команды, только факт, что это не отвечает на вопрос OP здесь.Важная часть, о которой вы все еще не понимаете: шестнадцатеричные значения - это просто другое представление двоичных значений. Большинство шестнадцатеричных редакторов или hexdumps будут отображать значения в шестнадцатеричной базе, потому что она более читаема, чем в двоичной базе.
Например:
Binary:
Что 35 и 32 в десятичном
Также 35 и 32 в десятичном виде
источник
vim
установить для использованияxxd
.Вы можете просмотреть файл в двоичном формате
vim
:vim
:% !xxd -b
Команда
xxd
может быть изменена, например:-g4
, что сгруппирует биты в 32-битные пакеты-c4
, который будет форматировать вывод, иметь 4 байта на строкуДобавление обоих флагов, приведенных выше, даст вам одно 32-битное целое число на строку.
источник
Вы можете сделать это, например, с помощью этой рубиновой строки:
Традиционная система на основе Си имеет паршивую поддержку для вывода материала в двоичном формате, AFAIK. Обычно это не очень полезно, так как его довольно сложно читать в отличие от шестнадцатеричных дампов.
источник
%08b
приводит к группировке вывода в байты.GHex - ваш друг :)
Вы можете установить его с помощью командной строки
Ubuntu:
Fedora:
источник