2009-09-13 4 views
3

Иногда, когда вы загружаете скомпилированный двоичный файл с неправильным типом mime или, например, запускаете команду «больше» в двоичном файле, вы получаете кучу «ужасного gook» из-за отсутствия лучшего термина.Что такое текстовое представление двоичных данных?

Например, это фрагмент того, что я вижу, когда я бегу «больше» из командной строки на очень простую программу, C, скомпилированный с GCC на OS X.

<94>^^^@^@ESC^@^@^@^^^A^@^@<A8>^^^@^@.^@^@^@^N^D^@^@^P ^@^@@^@^@^@^O^D^@^@^L ^@^@H^@^@^@^O^D^@^@^H ^@^@P^@^@^@^O 
^D^@^@^@ ^@^@\^@^@^@^C^@^P^@^@^P^@^@p^@^@^@^O^A^@^@b^_^@^@y^@^@^@^O^D^@^@^D ^@^@<82>^@^@^@^O^A^@^@<B6>^^^@^@<88> 
^@^@^@^O^A^@^@T^_^@^@<8D>^@^@^@^O^A^@^@T^^^@^@<93>^@^@^@^A^@^A^B^@^@^@^@<99>^@^@^@^A^@^A^B^@^@^@^@^L^@^@^@^M^@^@ 
^@ ^@dyld_stub_binding_helper^@__dyld_func_lookup^@dyld__mach_header^@_NXArgc^@_NXArgv^@___progname^@__mh_execute 
_header^@_average^@_environ^@_main^@_sum^@start^@_exit^@_printf^@^@^@^@ 

Может кто-то объяснить в простых терминах том, почему это? Что происходит, когда текстовый редактор или тип mime plain text пытается интерпретировать двоичные данные? Значит ли^@ что-нибудь в этом контексте? Почему есть какой-то текст и какой-то странный гук? Есть ли какой-либо стандарт для того, как эти двоичные данные представлены в тексте? Почему это не просто 1 и 0s?

Я могу концептуально понять ascii или unicode как представление символов в числовой системе, которая может быть уменьшена до двоичных 1 и 0 и числовой системы, которую понимает ЦП. Но на более высоком уровне я пытаюсь понять, что такое двоичные данные. Думаю, я хочу «увидеть абстракцию», если это имеет смысл.

Есть ли способ «видеть» двоичные данные каким-либо значимым образом в текстовом редакторе?

+0

Спасибо всем, кто откликнулся. Просто из любопытства, что означают угловые скобки в приведенном выше фрагменте? например <8D><93><99><8D><93><99> –

ответ

4

Разница между текстовыми и двоичными файлами невелика, за исключением диапазона значений, используемых в файлах. Каждое значение преобразуется в символ (в основном текстовом редакторе) на основе используемой кодовой страницы (ASCII, ANSI).

Вы видите символ «^ @», потому что значение байта в файле в этой позиции равно 0 (символ nul). Nul-символ не печатается, и поэтому больше программы отображает его с использованием нотной записи.

Вы можете открыть файл в шестнадцатеричном редакторе, который является текстовым редактором, который более чувствителен к двоичным данным. Я не очень хорошо знаком с программным обеспечением Mac, но бесплатный шестнадцатеричный редактор можно загрузить по адресу http://hexedit.sourceforge.net/.

Основные текстовые редакторы/зрители предполагают, что все, что вы открываете с ним, предназначено для чтения как обычный текст.

EDIT: Исправлены исправления Майка Спросса re:^@.

+0

Я также пытаюсь понять это, почему он показывает шестнадцатеричные значения вообще? Почему он просто не показывает 1 и 0? Дополнительно: как я могу заставить его показать 1 и 0? –

+0

@Nona: Я не знаю программ, которые показывают 0 и 1, но помните, что шестнадцатеричные значения (база 16) являются сокращением двоичных данных (база 2). Вы всегда можете преобразовать базовое значение 16 в его эквивалент базы 2. Просто любопытно, но вам нужно видеть 0 и 1 для определенной цели? –

+3

Собственно, '^ @' представляет символ '' \ 0'' (байт со значением 0). В случае OP больше отображается непечатаемые символы в файле с использованием нотной записи. См. Http://en.wikipedia.org/wiki/Caret_notation. –

1

Предлагаю использовать команду od в системе Unix. Это не текстовый редактор, но он по-прежнему хорош для анализа содержимого файлов. Если большинство символов печатаются, вы можете использовать od -c file.

LE: GNU od(1) man page

+0

Спасибо команде od od. Пробовал. Интересный инструмент. –

2

Есть ли способ, чтобы «видеть» двоичные данные в любого рода осмысленно в текстовом редакторе ?

Предлагаю шестигранный формат! Например, эти рекомендации для редактирования бинарных файлов в VIM ...:

ИСПОЛЬЗОВАНИЕ XXD

Реальный двоичный редактор показывает текст двумя способами: как это и в шестнадцатеричном формате. Вы можете сделать это в Vim сначала , конвертируя файл в программу «xxd» . Это происходит с Вимом. Во-первых редактировать файл в двоичном режиме:

ВИМ -b DataFile

Теперь преобразовать файл в шестнадцатеричный дамп с XXD:

:% XXD

текст будет выглядеть это:

0000000: 1f8b 0808 39d7 173b 0203 7474 002b 4e49 ....9..;..tt.+NI  
0000010: 4b2c 8660 eb9c ecac c462 eb94 345e 2e30 K,.`.....b..4^.0  
0000020: 373b 2731 0b22 0ca6 c1a2 d669 1035 39d9 7;'1.".....i.59. 

Теперь вы можете просматривать и редактировать текст как вам нравится. Vim обрабатывает информацию как обычный текст. Изменение шестнадцатеричного не приводит к изменению печатаемого символа или другим способом вокруг. Наконец преобразовать его обратно с:

:!% XXD -r

только изменения в шестигранной части используются. Изменения в текстовой части для печати на правые игнорируются.

См. Страницу руководства xxd для получения более информации.

+0

спасибо за подсказки vim и XXD. С помощью моих исследований и любопытства. –

1

Есть ли способ, чтобы «видеть» двоичные данные в любого рода осмысленно в текстовом редакторе ?

Короче говоря, нет. Двоичные данные могут означать абсолютно что угодно, и нет никакого способа, чтобы немой текстовый редактор мог понять это. (Действительно, даже умный человек не может понять это с абсолютной уверенностью.)

Обычный способ справиться с этим в системе Unix/Linux - использовать служебную программу командной строки «file». Это рассматривает начало файла и применяет эвристику, чтобы дать вам «наилучшее предположение» в типе файла. Исходя из этого, вы можете найти подходящий инструмент для просмотра содержимого файла. Если у вас нет средства просмотра/редактора/декомпилятора и т. Д., Который понимает формат, утилита «od» может показать ее вам в разных формах; например в шестнадцатеричном, восьмеричном, в качестве символов и т. д.

EDIT: разработать на «Бинарные данные могут означать абсолютно ничего»:

  • двоичный битовый шаблон, что это на выход (скажем) компилятор не может быть отличается от идентичного двоичный бит-образ, выводимый (скажем) случайным пользователем. Как я уже говорил, теоретически невозможно отличить случаи от бесконвертируемого внешнего знания процесса.

  • Распознавание двойных битовых комбинаций (например, как это сделано в программе «файл») является обычно основан на выявлении «магические числа» в первые несколько байт файла.Так, например, «волшебство» для исполняемого файла сценария «#!» в первые два байта. Если вы пишете приложение, то генерирует двоичный файл, который может иметь «#!» в качестве своих первых двух символов, это может привести к «файл», чтобы дать ложные спички, и маркировать свои двоичные файлы сценариев

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

Но даже определенный тип двоичного файла не решает проблему. Жесткая часть заключается в том, что кто-то должен написать конвертер для каждого двоичного файла типа, который будет извлекать и отображать значение файла. Для некоторых типов файлов эти преобразователи/средства визуализации уже существуют. Например, существуют дизассемблеры/декомпиляторы для многих форматов исполняемых кодовых файлов. Но такой конвертер не существует для всех типов двоичных файлов, а существующие конвертеры обычно являются автономными приложениями, а не модулями модулей для вашего любимого текстового редактора.

+0

Спасибо за ответ. «Двоичные данные могут означать абсолютно что-либо, и нет никакого способа, чтобы немой текстовый редактор мог понять это. (Действительно, даже умный человек не может понять это с абсолютной уверенностью.)« Я считаю, что это фактор времени и памяти. Очевидно, что компьютер может анализировать гораздо быстрее. Так что это имеет смысл для меня. –

+1

@ Gordon. Я имею в виду, что это буквально непознаваемо! Двоичные данные - это просто биты. Не зная, какой процесс породил эти биты, теоретически невозможно точно знать, что они означают. –

+0

Что касается структуры, если вы можете увидеть целое (например, один двоичный файл), тогда можно понять шаблон? Нет? Но я думаю, что у меня есть больше. Переверните один бит, и значение может сильно отличаться в зависимости от того, где бит был в последовательности. Вот где неопределенность.Так можно сказать, что процессоры полностью наивны в своей работе? Один бит следует за следующим, а процессор просто следует цепочке, ожидающей инструкции в последовательности. –

3

Двоичные файлы и текстовые файлы - одно и то же для компьютера, ведь все они - 0 и 1. Способ, которым вы видите содержимое файла, зависит от программы, которую вы используете для ее просмотра.
Текстовые редакторы (попытайтесь) интерпретировать символы 0 и 1 в символы и показать вам символы, которые они получают, которые вы можете просмотреть в качестве документа. Они делают предположение, что файлы, которые вы им даете, являются текстовыми файлами, содержащими символы ASCII. Однако это не относится к компьютерным файлам вообще, поскольку они могут содержать любые двоичные данные, которые не обязательно являются символами ASCII. Когда это произойдет, вместо того, чтобы давать вам сообщение об ошибке, некоторые текстовые редакторы дают вам уродливое и неправильное представление данных в файле (поскольку они все равно не понимают данные).
Hex-редакторы - это скорее инструмент для вундеркиндов, так как они также дают вам данные компьютера в шестнадцатеричном формате (более читаемый формат по сравнению с двоичным). Некоторые шестнадцатеричные редакторы также предоставляют вам ASCII-символы, которые они обнаруживают, поэтому это событие более удобно.
Alex дал вам очень классный инструмент командной строки, но если вам нужен какой-то графический интерфейс, быстрый google с «шестнадцатеричным редактором» даст вам слишком много программ, чтобы попробовать.

+0

Спасибо за объяснение. –

1

Бинарное представление данных (только единицы и нулей) потребует слишком большого пространства экрана.

Эквиваленты шестнадцатеричного или ascii более сжатые, и наши мозги предпочитают это.

Мы должны обработать комбинированный экран hex/ascii (например, с помощью команды od), как попытку показать, какие данные будут выглядеть так, как будто это были шестнадцатеричные данные, и как это будет выглядеть должен был быть ТЕКСТ.

Но, как сказал Стивен С, текстовый редактор не может точно решить, какими должны быть байты, поэтому он дает только подсказку.

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

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

+0

Спасибо за ответ. «Мы должны рассматривать комбинированный экран hex/ascii (например, с помощью команды od), как попытку показать, какие данные будут выглядеть так, как будто это были шестнадцатеричные данные, и как это выглядело бы так, как будто это предназначалось для ТЕКСТ. " Мне очень нравится это объяснение с сослагательным наклонением «БУДЕТ». Это еще больше усиливает мои мысли. –

1

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

Текстовый файл должен различать более двух разных символов, поэтому он группирует последовательность двоичных бит в более сложную единицу. Например, последовательность из 8 бит может быть интерпретирована как один символ ASCII (значения варьируются от 0 до 255).

Поскольку текстовые файлы представляют собой внутреннюю последовательность двоичных битов (единиц и нулей), любая серия двоичных битов может быть интерпретирована как текстовый файл. Результат в вашем примере является результатом попытки интерпретировать двоичные биты исполняемого файла в виде текстового файла. Большинство символов являются нежелательными (не имеют смысла как последовательность символов ASCII), но есть некоторые части, которые имеют смысл, потому что они были сохранены как строки ASCII.

Каждый формат файла имеет контракт на то, что представляет собой двоичный бит. В случае с исполняемым файлом он намного сложнее простого текстового файла, но формат исполняемого файла также содержит части, которые хранят строки ASCII, такие как текстовый файл.

Если вы просматриваете файл с помощью шестнадцатеричного редактора, вы можете видеть как двоичное представление файла, так и текстовую интерпретацию ASCII двоичного кода сбоку. Обратите внимание, что двоичное представление отображает данные в более компактной форме: hexidecimal. Последовательность 4 двоичных бит представлена ​​одним шестнадцатеричного числа в диапазон от 0 до F.

+0

Спасибо за объяснение ASCII, ваше объяснение имеет для меня большой смысл. –

Смежные вопросы