私が理解していることから、コンパイラは、CPUが読み取ることができる1と0で構成されるバイナリファイルを作成します。バイナリファイルがありますが、それを開いて1と0を確認するにはどうすればよいですか?テキストエディターはそれを開くことができないと言います...
追伸1と0のプレーンバイナリコードである必要があるアセンブリコンパイル済みバイナリがありますか?
hexdump -C yourfile.bin
もちろんそれを編集したくない限り。ほとんどのLinuxディストリビューションには、デフォルトで
hexdump
があります(ただし、すべてではないことは明らかです)。
この答え による Emilio Bool によると:
xxd
は2進数と16進数の両方を実行しますビンの場合:
xxd -b file
16進数の場合:
xxd file
さまざまな人々がクエリのいくつかの側面に答えましたが、すべてではありません。
コンピュータ上のすべてのファイルは1と0として保存されます。画像、テキストファイル、音楽、実行可能なアプリケーション、オブジェクトファイルなど.
それらはすべて0と1です。唯一の違いは、何を開くかによって解釈が異なることです。
cat
を使用してテキストファイルを表示すると、実行可能ファイル(この場合はcat
)が1と0をすべて読み取り、それらを関連するアルファベットまたは言語の文字に変換して表示します。 。
画像ビューアを使用してファイルを表示すると、1と0をすべて取り、それらを画像に変換します。これは、ファイルの形式とそれをすべて機能させるためのロジックによって異なります。
コンパイルされたバイナリファイルも同じで、1と0として格納されます。
arzyfexの答えは、それらのファイルをさまざまな方法で表示するツールを提供しますが、バイナリとしてファイルを読み取ることは、コンピュータ上の任意のファイルに対して機能します。それらのフォーマットの。
実行可能バイナリファイルの機能を理解したい場合は、アセンブラー言語を(最初から)示す方法で表示する必要があります。
objdump -d /path/to/binary
これは逆アセンブラーであり、バイナリコンテンツを取得してアセンブラー(非常に低レベルのプログラミング言語)に変換します。 objdump
はデフォルトで常にインストールされるとは限らないため、Linux環境によってはインストールする必要がある場合があります。
いくつかの外部の読書。
注意:@Wildcardが指摘するように、ファイルには文字1と0が含まれていないことに注意してください(画面に表示されます)。 、実際の数値データ、オン(1)またはオフ(0)の個々の情報ビットが含まれます。その説明でさえ、真実の近似にすぎません。重要な点は、1と0を表示するビューアを見つけた場合でも、ファイルからのデータを解釈していて、ASCII 0と1の文字を表示していることです。データはバイナリ形式で保存されます(上記のバイナリ番号のリンクを参照してください) Pierre-Olivierのコミュニティwikiエントリ これについて詳しく説明しています。
低レベルでは、ファイルは0と1のシーケンスとしてエンコードされます。
しかし、プログラマーでさえ実際にそこに行くことはめったにありません。
最初(そしてこの0と1の話よりも重要です)、コンピュータが操作するものはすべてnumbers。
文字は、文字セットテーブルを使用して番号でコード化されます。たとえば、ASCIIを使用してコード化すると、文字「A」の値は65になります。参照 http://www.asciitable.com
ピクセルは1つ以上の数値でコード化されます(多くのグラフィック形式があります)たとえば、標準の3色形式では、黄色のピクセルは次のようにエンコードされます:赤は255、緑は255、青は0。参照 http://www.quackit.com/css/css_color_codes.cfm (色を選択して、R、G、Bのセルを確認)
バイナリ実行可能ファイルはアセンブリで記述されています。各アセンブリ命令は番号としてコード化されています。たとえば、アセンブリ命令MOVB $0x61,%al
は2つの数値でコード化されます:176,97 http://www.sparksandflames.com/files/x86InstructionChart.html を参照してください(16進表記のため、各命令には00からFFまでの番号が関連付けられています)使用されます。以下を参照してください)
2番目に:各数値は、複数の表現またはnotations。
私が23個のリンゴを持っているとしましょう。
しかし、16個のリンゴのグループを作ることもできます。それで、16個のグループの1つと、7つの孤独なリンゴを取得します。 hexadecimal表記(つまり、16基数と呼ばれます)では、17(16 + 7)と記述します。 10進表記と区別するために、16進表記は通常、接頭辞または接尾辞(17h、#17、または$ 17)で示されます。しかし、16個以上の16のグループ、または9個以上の単独のリンゴを表すにはどうすればよいでしょうか。単純に、A(10)からF(15)までの文字を使用します。数値31(31リンゴのように)は、16進数で#1Fと表記されます。
同じ行で、2つのリンゴのグループを作成できます。 (2つのグループの2つのリンゴのグループ、つまりgroup-of-2x2-applesなど)。次に、23は次のとおりです。1group-of-2x2x2x2-apples、0 group-of-2x2x2-apples、1 group-of-2x2apples、1 group of 2 apples、および1 group Appleバイナリでは10111と表示されます。
( https://en.wikipedia.org/wiki/Radix を参照)
物理的には、2つの状態(スイッチ)を許可するメカニズムは、メモリストレージ内のディスク上と同様に簡単に実行できます。
そのため、数値と見なされるデータとプログラムは、バイナリ形式で記述および操作されます。
次に、データタイプに応じて、適切な形式(文字A、黄色のピクセル)に変換または実行(MOV命令)します。
hexdump
は、データ(またはアセンブリプログラム)を16進数形式でコード化した数値をリストします。次に、計算機を使用して、対応するバイナリ形式を取得できます。
私は od
(オクタルダンプ) から始め、システムによっては objdump
などのツールが役立つ場合があります。
Linux stringsコマンドは、印刷可能な文字の文字列をファイルに出力します。例:
$ 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
など...それはバイナリよりもかなり読みやすいです。
一連の16進値として表示される16進エディタで開くことができます。 xxd file
あなたは何を成し遂げようとしているのですか?
まだ混乱しているように思われる重要な部分:16進値は、バイナリ値の異なる表現にすぎません。ほとんどの16進エディターまたは16進ダンプは、バイナリベースよりも読みやすいため、16進ベースで値を表示します。
例えば。:
バイナリ:
xxd -b README.md
00000000: 00100011 00100000
10進数で35と32です。
xxd README.md
00000000: 2320
また、10進数で35と32
次のようにすると、vim
のファイルをバイナリで表示できます。
vim
でファイルを開く:% !xxd -b
を入力していますxxd
コマンドはさらに調整できます。次に例を示します。
-g4
を追加して、32ビットパックのビットをグループ化します。-c4
を追加して、1行あたり4バイトにする上記の両方のフラグを追加すると、1行に1つの32ビット整数が得られます。
これは、たとえば、Ruby one-liner:
$ Ruby -e 'while c=STDIN.read(1); printf "%08b" % c.bytes.first; end'
従来のCベースのシステムは、AFAIKでバイナリを出力するための粗末なサポートを備えています。 16進ダンプとは異なり、読み取りが非常に難しいため、通常はあまり役に立ちません。
GHexはあなたの友達です:)
コマンドラインを使用してインストールできます
Ubuntu:
Sudo apt-get install ghex
Fedora:
Sudo yum install ghex