Як переглянути двійковий файл?


45

З того, що я розумію, компілятор створює двійковий файл, що складається з 1-х та 0-х, які може читати процесор. У мене є двійковий файл, але як його відкрити, щоб побачити 1 і 0, які там є? Текстовий редактор каже, що не може його відкрити ...

PS У мене складений двійковий збір, який повинен бути простим двійковим кодом 1 і 0?


1
коли ви
покажете

2
Дублікат питання stackoverflow.com/questions/1765311 / ...
МАЗС

ні - ОП вказано "збірка складена двійковою". Це не стосується питання. Наприклад, це не музичний файл, він має структуру. Без надання додаткової інформації ОП може почати неструктурований інструмент.
Томас Дікі

1
Дивіться мою відповідь. І зауважте, що термін двійковий використовується на практиці абсолютно різними способами: "Бінарний файл" означає файл, контекст якого не є чистим ASCII-текстом. "Двійкове число" означає число, записане з використанням його двійкової форми.
П’єр-Олів'є Варес

@mazs ASCII? Я думаю, що UTF-8 є більш імовірним, або якоюсь кодовою сторінкою, якщо програма вважає, що вона, схоже, закодована таким чином через хуристику.
JDługosz

Відповіді:


99

Згідно цій відповіді по Тіранід :

hexdump -C yourfile.bin 

якщо ви, звичайно, не хочете його редагувати. Більшість дистрибутивів Linux hexdumpза замовчуванням мають (але, очевидно, не всі).


Оновлення

Згідно цій відповіді по Еміліо Bool :

xxd робить як двійкові, так і шістнадцяткові

Для сміття:

xxd -b file

Для шестигранника:

xxd file

Це справді допомогло! Дякую
Шравія Богарапу

45

Різні люди відповіли на деякі аспекти запиту, але не всі.

Усі файли на комп'ютерах зберігаються як "1" та "0". Зображення, текстові файли, музика, виконувані програми, файли об'єктів тощо.

Вони всі 0 і 1. Єдина відмінність полягає в тому, що вони трактуються по-різному залежно від того, що їх відкриває.

Коли ви переглядаєте текстовий файл за допомогою cat, виконуваний файл ( catу цьому випадку) зчитує всі знаки "1" та "0", і він представляє їх вам, перетворюючи їх у символи з відповідного алфавіту чи мови.

Коли ви переглядаєте файл за допомогою засобу перегляду зображень, він займає всі 0 і 0 і перетворює їх на зображення, залежно від формату файлу та певної логіки, щоб все це виправити.

Скомпільовані двійкові файли не відрізняються, вони зберігаються як "1" та "0".

Відповідь arzyfex дає вам інструменти для перегляду цих файлів різними способами, але читання файлу як бінарного працює для будь-якого файлу на комп’ютері, як і перегляд його як восьмеричний, або шістнадцятковий, або взагалі ASCII, просто не може мати сенсу в кожному цих форматів.

Якщо ви хочете зрозуміти, що робить виконуваний бінарний файл, вам потрібно переглянути його таким чином, що показує вам мову асемблера (як початок), яку ви можете зробити, використовуючи,

objdump -d /path/to/binary

який є розбиральником, він бере бінарний вміст і перетворює його назад у асемблер (що є мовою програмування дуже низького рівня). objdumpне завжди встановлюється за замовчуванням, тому, можливо, його потрібно встановити залежно від вашого середовища Linux.

Деякі зовнішні читання.

Примітка: як зазначає @Wildcard, важливо зазначити, що файли не містять символів 1 і 0 (як ви їх бачите на екрані), вони містять фактичні числові дані, окремі біти інформації, які знаходяться на (1) або вимкнено (0). Навіть цей опис є лише наближенням істини. Їх ключовим моментом є те, що якщо ви знайдете глядача, який показує вам «1» та «0», навіть той, що все ще інтерпретує дані з файлу, а потім показує вам символи ASCII для 0 і 1. Дані зберігаються у двійковому форматі ( див. посилання Бінарне число вище). Записи вікі спільноти П'єра-Олів'є висвітлюють це більш докладно.


Добре експозиція. Ви можете додати, що символи, які ви бачите в рядку тексту як "1" або "0", не зберігаються комп'ютером як "1" або "0"; ОП, здається, має плутанину з цього приводу.
Wildcard

1
Я б посперечався (тобто не погоджуюся) з вашим твердженням: "Коли ви переглядаєте текстовий файл за допомогою cat, виконуваний файл ( catу цьому випадку) зчитує всі знаки" 1 "та" 0 ", і він представляє їх вам, перетворюючи їх у символи з відповідного алфавіту або мова." catне робить цього; все cat- це байти запису до стандартного виводу (якщо ви не використовуєте "шкідливі" параметри). Програма терміналу (та / або апаратне забезпечення терміналу, якщо це застосовується, тобто його мікропрограмне забезпечення) визначає, як байти відображати як символи, можливо, за допомогою драйвера TTY.
G-Man каже «Відновити Моніку»

Я не погоджуюся, але в якийсь момент всі прості описи ламаються, питання полягає в тому, наскільки далеко в кролячій норі ви ходите, перш ніж перестати описувати речі.
ВісімBitTony

14

На низькому рівні файл кодується як послідовність 0 і 1.

Але навіть програмісти рідко їздять туди на практиці.

По-перше, (і важливіше, ніж ця історія з 0-х та 1-х), ви повинні зрозуміти, що все, що комп'ютер маніпулює, кодується цифрами .

  • Символ кодується числом, використовуючи таблиці наборів символів. Наприклад, літера "А" має значення 65 при кодуванні за допомогою ASCII. Дивіться http://www.asciitable.com

  • Піксель кодується одним або кількома числами (графічних форматів дуже багато) Наприклад, у стандартному 3-кольоровому форматі жовтий піксель кодується як: 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 яблука.

  • Якщо я зроблю групи з десяти яблук, я отримаю: 2 групи з десяти і 3 самотніх яблука. Саме так ми маємо на увазі, коли пишемо 23: a 2 (десятки), а потім 3 (одиниці).
  • Але я також можу зробити групи з 16 яблук. Тож я отримаю одне яблуко групи 16, і 7 самотніх. У шістнадцятковій нотації (саме так називають 16 радіксів) я напишу: 17 (16 + 7). Щоб відрізнити від десяткового позначення, шістнадцяткові позначення зазвичай відзначаються з префіксом або суфіксом: 17h, # 17 або $ 17. Але як представити більше 9 яблук групи або 16 або більше 9-ти яблук? Просто ми використовуємо літери від A (10) до F (15). Число 31 (як у 31 яблуці) записується як шрифтовий знак №1F.

  • У цьому ж рядку ми можемо зробити групу з двох яблук. (І група з двох яблук групи з двох груп, тобто з яблук групи 2х2 тощо). Тоді 23: 1 яблука групи-2х2х2х2-яблука, 0 яблук групи-2х2х2-2 яблук, 1 яблука групи-2х2-2, 1 групи 2 яблук та 1 яблуко-одиноке.

(Дивіться https://en.wikipedia.org/wiki/Radix )

Фізично, механізми, що дозволяють два стани (комутатори), легко зробити, як і на диску, який зберігається в пам'яті.

Ось чому дані та програми, розцінені як числа, записуються та маніпулюються у своїй бінарній формі.

Потім перекладається - залежно від типу даних - у відповідну форму (літера A, жовтий піксель) або виконується (інструкція MOV).

hexdumpперераховує числа, що кодують дані (або програму складання) у шістнадцятковій формі. Потім можна скористатися калькулятором, щоб отримати відповідну бінарну форму.



4

Ви можете відкрити його в шістнадцятковому редакторі, який показує це як серію шістнадцяткових значень. xxd file

Що ви намагаєтеся досягти?


Але я думав, що комп'ютер може читати лише 1 та 0. Чи можу я їх побачити? Я намагаюся зрозуміти, як працюють комп’ютери
Мартін Зелтін

2
Це одне вам не дуже допоможе. Якщо ви хочете дізнатись, як саме це працює, то у вікні Linux подивіться формат файлу ELF та en.wikipedia.org/wiki/X86_instruction_listings . Якщо ви просто хочете побачити код, який генерується компілятором, погляньте на його запуск з gdb. Оскільки ви хочете отримати більше "низького рівня", перевірте також nand2tetris.org. Щодо мови складання, я чую, що збірка 6502 і mips набагато приємніша за збірку x86_64 / x86
theblazehen

@theblazehen Сучасний асемблер сімейства x86 - звір. 8086 був керованим, і я думаю, що майже будь-який процесор з тієї епохи (кінець 1970-х до першої половини 1980-х років) повинен бути терпимим, наскільки йде асемблер.
CVn


3

Команда рядків Linux друкує рядки символів для друку у файлах, наприклад:

$ strings /usr/bin/gnome-open 
/lib64/ld-linux-x86-64.so.2
3;o:)
libgnome-2.so.0
_ITM_deregisterTMCloneTable
g_object_unref
gmon_start__
g_dgettext
_Jv_RegisterClasses
g_strdup
_ITM_registerTMCloneTable
g_error_free
gnome_program_init
libgnome_module_info_get
libgio-2.0.so.0
g_ascii_strncasecmp

тощо ... це набагато читабельніше, ніж двійкове.


ОП запитав, як я відкрию його, щоб побачити 1 та 0, які там є? але stringsкоманда позбавить більшість байтів, які він хоче бачити.
jlliagre

@jlliagre - хоча ви маєте рацію, stringsкоманда - особливо з більшою довжиною, як strings -n 6- - дійсно допомагає з'ясувати, що у ній є бінарний файл, якщо він містить будь-які рядкові константи тощо. Ця відповідь повинна була б бути коментарем, то це буде були добре.
Джо

@Joe Так, я не сумніваюся у stringsкорисності команд, лише той факт, що вона не відповідає на питання OP тут.
jlliagre

3

Важлива частина, щодо якої ви все ще здаєтеся заплутаною: Шістнадцяткові значення - це лише різне представлення бінарних значень. Більшість шестнадцяткових редакторів або шістнадцяткових показів відображатимуть значення в шістнадцятковій базі, оскільки це читабельніше, ніж у двійковій базі.

Наприклад:

Двійковий:

xxd -b README.md                                                                
00000000: 00100011 00100000

Що становить 35 і 32 у десятковій частині

xxd README.md                                                                   
00000000: 2320

Також 35 і 32 у десятковій частині


Про це згадували й інші люди . Однак це хороший підсумок. Ви можете відредагувати свою відповідь, якщо хочете змінити перший абзац.
wizzwizz4

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

Зауважте, що вам потрібно vimвстановити їх xxd.
starbeamrainbowlabs

2

Ви можете переглянути файл у двійковій формі vimза:

  • Відкриття файлу в vim
  • Вхід :% !xxd -b

xxdКоманда може бути змінений в подальшому, наприклад:

  • Додавши -g4, що згрупує біти в 32-бітні пакети
  • Додавши -c4, що буде форматувати вихід, мати 4 байти на рядок

Якщо додати обидва позначки вище, ви отримаєте одне 32-бітове ціле число на рядок.


1

Ви можете зробити це, наприклад, з цим рубіновим одноколірним:

$ ruby -e 'while c=STDIN.read(1); printf "%08b" % c.bytes.first; end'

Традиційна система на основі С має слабку підтримку для виведення матеріалів у двійковій формі, AFAIK. Зазвичай це не дуже корисно, оскільки його важко читати на відміну від шістнадцяткових смітників.


Дякую! Додавання простору безпосередньо після %08bпримушує його групувати вихід у байти.
starbeamrainbowlabs

0

GHex - ваш друг :)
Ви можете встановити його за допомогою командного рядка

Ubuntu:

sudo apt-get install ghex

Fedora:

sudo yum встановити ghex

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.