Bagaimana cara melihat file biner?

45

Dari apa yang saya mengerti, kompiler membuat file biner yang terdiri dari 1 dan 0 yang dapat dibaca CPU. Saya memiliki file biner tetapi bagaimana cara membukanya untuk melihat angka 1 dan 0 yang ada di sana? Editor teks mengatakan tidak dapat membukanya ...

PS Saya punya majelis yang dikompilasi biner yang seharusnya menjadi kode biner sederhana 1 dan 0?

Martin Zeltin
sumber
1
ketika Anda menampilkan file biner, Anda akan melihatnya sebagai karakter ascii
mazs
2
duplikat masalah stackoverflow.com/questions/1765311/…
mazs
no - OP menentukan "binary compile binary". Itu tidak menjawab pertanyaan. Misalnya, ini bukan file musik, dan memiliki struktur. Tanpa OP memberikan informasi tambahan, alat yang tidak terstruktur adalah tempat untuk memulai.
Thomas Dickey
1
Lihat jawaban saya. Dan berhati-hatilah bahwa istilah biner digunakan dalam dua cara yang sama sekali berbeda dalam praktiknya: "File biner" berarti file yang konteksnya bukan teks ASCII murni. "Angka biner" berarti angka yang ditulis menggunakan bentuk binernya.
Pierre-Olivier Vares
@Mazs ASCII? Saya pikir UTF-8 lebih mungkin, atau beberapa halaman kode jika program berpikir sepertinya dikodekan seperti itu melalui huristics.
JDługosz

Jawaban:

99

Menurut jawaban ini oleh tyranid :

hexdump -C yourfile.bin 

kecuali jika Anda ingin mengeditnya tentu saja. Sebagian besar distro Linux hexdumpsecara default (tapi jelas tidak semua).


Memperbarui

Menurut jawaban ini oleh Emilio Bool :

xxd tidak biner dan heksadesimal

Untuk bin:

xxd -b file

Untuk hex:

xxd file
Rahul
sumber
Ini sangat membantu! Terima kasih
Shravya Boggarapu
hanya melihat head: xxd filename | head
Adam
45

Berbagai orang telah menjawab beberapa aspek permintaan, tetapi tidak semua.

Semua file di komputer disimpan sebagai file 1 dan 0. Gambar, file teks, musik, aplikasi yang dapat dieksekusi, file objek, dll.

Semuanya 0 dan 1. Satu-satunya perbedaan adalah bahwa mereka ditafsirkan berbeda tergantung pada apa yang membukanya.

Ketika Anda melihat file teks menggunakan cat, executable ( catdalam hal ini) membaca semua 1 dan 0 dan menyajikannya kepada Anda dengan mengubahnya menjadi karakter dari alfabet atau bahasa yang relevan.

Ketika Anda melihat file menggunakan penampil gambar, dibutuhkan semua 1 dan 0 dan mengubahnya menjadi gambar, tergantung pada format file dan beberapa logika untuk menyelesaikannya.

File biner yang dikompilasi tidak berbeda, mereka disimpan sebagai file 1 dan 0.

Jawaban arzyfex memberi Anda alat untuk melihat file-file dengan cara yang berbeda, tetapi membaca file sebagai biner berfungsi untuk file apa pun di komputer, seperti halnya melihatnya sebagai oktal, atau hex, atau memang ASCII, mungkin saja tidak masuk akal di setiap format tersebut.

Jika Anda ingin memahami apa yang dilakukan file biner yang dapat dieksekusi, Anda perlu melihatnya dengan cara yang menunjukkan kepada Anda bahasa assembler (sebagai permulaan), yang dapat Anda lakukan menggunakan,

objdump -d /path/to/binary

yang merupakan disassembler, mengambil konten biner dan mengubahnya kembali menjadi assembler (yang merupakan bahasa pemrograman tingkat sangat rendah). objdumptidak selalu diinstal secara default, jadi mungkin perlu diinstal tergantung pada lingkungan Linux Anda.

Beberapa bacaan eksternal.

NB: seperti yang ditunjukkan @Wildcard, penting untuk dicatat bahwa file tidak mengandung karakter 1 dan 0 (seperti yang Anda lihat di layar), itu berisi data numerik aktual, bit informasi individual yang dihidupkan (1) atau mati (0). Bahkan deskripsi itu hanyalah perkiraan kebenaran. Poin utama mereka adalah bahwa jika Anda menemukan penampil yang menunjukkan Anda 1 dan 0, bahkan itu masih menafsirkan data dari file dan kemudian menunjukkan kepada Anda karakter ASCII untuk 0 dan 1. Data disimpan dalam format biner ( lihat tautan Nomor biner di atas). Entri wiki komunitas Pierre-Olivier membahas hal ini lebih terinci.

EightBitTony
sumber
Paparan bagus. Anda mungkin ingin menambahkan bahwa karakter yang Anda lihat dalam satu baris teks sebagai "1" atau "0" tidak disimpan sebagai satu "1" atau "0" oleh komputer; OP tampaknya memiliki kebingungan tentang itu.
Wildcard
1
Saya akan berdalih (yaitu, tidak setuju) dengan pernyataan Anda, "Ketika Anda melihat file teks menggunakan cat, executable ( catdalam hal ini) membaca semua angka 1 dan 0 dan menyajikannya kepada Anda dengan mengonversinya menjadi karakter dari alfabet Anda yang relevan atau bahasa." cattidak melakukan itu; semua catlakukan adalah menulis byte ke output standar (kecuali jika Anda menggunakan opsi "berbahaya" ). Program terminal (dan / atau perangkat keras terminal, jika berlaku, yaitu firmware-nya) menentukan cara merender byte sebagai karakter, mungkin dengan bantuan dari driver TTY.
G-Man Mengatakan 'Reinstate Monica'
Saya tidak setuju, tetapi pada beberapa titik, semua deskripsi sederhana rusak, pertanyaannya adalah seberapa jauh Anda pergi ke lubang kelinci sebelum Anda berhenti menggambarkan hal-hal sederhana.
EightBitTony
14

Pada level rendah, file dikodekan sebagai urutan 0 dan 1.

Tetapi bahkan programmer jarang pergi ke sana dalam praktek.

Pertama (dan lebih penting daripada cerita 0 dan 1 ini), Anda harus memahami bahwa apa pun yang dimanipulasi komputer dikodekan dengan angka .

  • Karakter dikodekan dengan angka, menggunakan tabel set karakter. Misalnya, huruf 'A' memiliki nilai 65 ketika dikodekan menggunakan ASCII. Lihat http://www.asciitable.com

  • Piksel dikodekan dengan satu angka atau lebih (Ada banyak format grafis) Misalnya, dalam format 3-warna standar, piksel kuning dikodekan sebagai: 255 untuk Merah, 255 untuk Hijau, 0 untuk Biru. Lihat http://www.quackit.com/css/css_color_codes.cfm (pilih warna dan lihat sel R, G & B)

  • File biner-executable ditulis dalam Assembly; setiap instruksi perakitan dikodekan sebagai angka. Misalnya, instruksi perakitan MOVB $0x61,%aldikodekan oleh dua angka: 176,97 Lihat http://www.sparksandflames.com/files/x86InstructionChart.html (Setiap instruksi memiliki angka yang terkait dari 00 hingga FF, karena notasi heksadesimal digunakan, Lihat di bawah)

Kedua : setiap angka dapat memiliki banyak representasi atau notasi .

Katakanlah saya punya 23 apel.

  • Jika saya membuat kelompok sepuluh apel, saya akan mendapatkan: 2 kelompok sepuluh dan 3 apel tunggal. Itulah tepatnya yang kita maksudkan ketika kita menulis 23: a 2 (puluhan), lalu 3 (unit).
  • Tapi saya juga bisa membuat kelompok 16 apel. Jadi saya akan mendapatkan satu Group-of-16, dan 7 apel sendirian. Dalam notasi heksadesimal (begitulah yang disebut 16 radix), saya akan menulis: 17 (16 + 7). Untuk membedakan dari notasi desimal, notasi heksadesimal biasanya dicatat dengan awalan atau akhiran: 17h, # 17 atau $ 17. Tetapi bagaimana cara mewakili lebih dari 9 Kelompok-16, atau lebih dari 9 apel saja? Sederhananya, kami menggunakan huruf dari A (10) hingga F (15). Angka 31 (seperti pada 31 apel) ditulis sebagai # 1F dalam heksadesimal.

  • Pada baris yang sama, kita dapat melakukan kelompok dua apel. (Dan kelompok dua kelompok apel dua, yaitu kelompok apel 2x2, dan seterusnya). Kemudian 23 adalah: 1 kelompok apel 2x2x2x2, 0 kelompok apel 2x2x2, apel 1 kelompok 2x2, apel 1 kelompok 2, dan 1 apel saja yang akan dicatat 10111 dalam biner.

(Lihat https://en.wikipedia.org/wiki/Radix )

Secara fisik, mekanisme yang memungkinkan dua keadaan (sakelar) mudah dilakukan, juga pada disk yang ada di penyimpanan memori.

Itu sebabnya data dan program, dilihat sebagai angka, ditulis dan dimanipulasi dalam bentuk binernya.

Kemudian diterjemahkan - tergantung pada tipe data - ke dalam bentuk yang sesuai (huruf A, piksel kuning) atau dieksekusi (instruksi MOV).

hexdumpdaftar angka-angka yang mengkode data (atau program perakitan) dalam bentuk heksadesimal itu. Anda kemudian dapat menggunakan kalkulator untuk mendapatkan formulir biner yang sesuai.

Pierre-Olivier Vares
sumber
10

Saya akan mulai dengan od(octal dump) , dan tergantung pada sistemnya, mungkin menemukan alat seperti objdumpberguna.

Thomas Dickey
sumber
Opsi POSIX.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
4

Anda bisa membukanya di hex editor yang menunjukkannya sebagai serangkaian nilai heksadesimal. xxd file

Apa yang ingin Anda capai?

theblazehen
sumber
Tapi saya pikir komputer hanya bisa membaca 1 dan 0. Bisakah saya melihat itu? Saya mencoba memahami cara kerja komputer
Martin Zeltin
2
Itu saja tidak akan banyak membantu Anda. Jika Anda ingin mempelajari cara kerjanya secara tepat, maka pada kotak Linux lihatlah format file ELF, dan en.wikipedia.org/wiki/X86_instruction_listings . Jika Anda hanya ingin melihat kode yang dihasilkan oleh kompiler, coba jalankan dengan gdb. Karena Anda ingin mendapatkan lebih banyak "level rendah", periksa juga nand2tetris.org. Untuk bahasa assembly saya dengar bahwa 6502 dan mips assembly jauh lebih bagus daripada x86_64 / x86 assembly
theblazehen
@theblazehen Perakit keluarga x86 modern adalah beast. 8086 dikelola, dan saya pikir hampir semua CPU dari sekitar era itu (akhir 1970-an hingga paruh pertama 1980-an) harus dapat ditoleransi sejauh assembler berjalan.
CVn
4

bviadalah editor Binary VIsual dengan vim keybindings. Ini tersedia di sebagian besar sistem linux.

masukkan deskripsi gambar di sini

Gilles Castel
sumber
3

Perintah Linux strings mencetak string karakter yang dapat dicetak dalam file, misalnya:

$ 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

dll ... itu lebih mudah dibaca daripada biner.

ponsfrilus
sumber
OP bertanya bagaimana cara membukanya untuk melihat angka 1 dan 0 yang ada? tetapi stringsperintah itu akan menghapus sebagian besar byte yang ingin dilihatnya.
jlliagre
@ jlliagre - ketika Anda benar, stringsperintah - terutama dengan panjang yang lebih panjang seperti strings -n 6- benar-benar membantu mencari tahu apa file biner di dalamnya jika berisi konstanta string, dll. Jawaban ini seharusnya komentar, maka itu akan menjadi komentar, maka itu akan sudah baik-baik saja.
Joe
@ Jo Ya, saya tidak mempertanyakan stringskegunaan perintah, hanya saja fakta itu tidak menjawab pertanyaan OP di sini.
jlliagre
3

Bagian penting yang membuat Anda masih bingung: Nilai heksadesimal hanyalah representasi berbeda dari nilai biner. Sebagian besar hex editor atau hexdumps akan menampilkan nilai dalam basis heksadesimal, karena itu lebih mudah dibaca daripada di basis biner.

Misalnya:

Biner:

xxd -b README.md                                                                
00000000: 00100011 00100000

Yaitu 35 dan 32 dalam desimal

xxd README.md                                                                   
00000000: 2320

Juga 35 dan 32 dalam desimal

Kamis Selanjutnya
sumber
Orang lain telah menyebutkan ini. Namun, ini ringkasan yang bagus. Anda dapat mengedit jawaban Anda jika Anda ingin mengubah paragraf pertama.
wizzwizz4
Baiklah, saya belum pernah melihat orang menyebutkannya, saya mungkin melewatkannya.
Kamis
Perhatikan bahwa Anda perlu vimdiinstal untuk menggunakan xxd.
starbeamrainbowlabs
2

Anda dapat melihat file dalam biner di vim, dengan:

  • Membuka file vim
  • Memasuki :% !xxd -b

The xxdperintah dapat men-tweak lebih lanjut, misalnya:

  • Dengan menambahkan -g4, yang akan mengelompokkan bit dalam paket 32-bit
  • Dengan menambahkan -c4, yang akan memformat output, memiliki 4 byte per baris

Menambahkan kedua flag di atas, akan memberi Anda satu bilangan bulat 32-bit per baris.

Leandros
sumber
1

Anda dapat melakukannya dengan mis., Ruby one-liner ini:

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

Sistem berbasis C tradisional memiliki dukungan buruk untuk menghasilkan barang dalam biner, AFAIK. Ini biasanya tidak terlalu berguna karena cukup sulit dibaca tidak seperti dump heksadesimal.

PSkocik
sumber
Terima kasih! Menambahkan spasi secara langsung setelah %08bmenyebabkannya mengelompokkan output menjadi byte.
starbeamrainbowlabs
0

GHex adalah teman
Anda :) Anda dapat menginstalnya menggunakan baris perintah

Ubuntu:

sudo apt-get install ghex

Fedora:

sudo yum instal ghex

kasar
sumber