내가 이해한 바로는 컴파일러는 CPU가 읽을 수 있는 1과 0으로 구성된 이진 파일을 생성합니다. 바이너리 파일이 있는데 그 안에 있는 1과 0을 보려면 어떻게 열어야 합니까? 텍스트 편집기에서 열 수 없다고 합니다...
추신: 어셈블리 컴파일 바이너리가 있습니다. 1과 0에 대한 순수 바이너리 코드여야 합니까?
답변1
답변2
많은 사람들이 이 질문의 일부 측면에 답변했지만 전부는 아닙니다.
컴퓨터의 모든 파일은 1과 0으로 저장됩니다. 이미지, 텍스트 파일, 음악, 실행 가능한 응용 프로그램, 개체 파일 등
그것들은 모두 0과 1이다. 유일한 차이점은 무엇을 여는가에 따라 다르게 해석된다는 것입니다.
cat
다음을 사용하여 텍스트 cat
파일을 볼 때
이미지 뷰어를 사용하여 파일을 보면 파일 형식과 일부 논리에 따라 모든 1과 0이 이미지로 변환됩니다.
컴파일된 바이너리는 다르지 않으며 1과 0으로 저장됩니다.
arzyfex의 답변은 이러한 파일을 다양한 방식으로 볼 수 있는 도구를 제공하지만 이진 형식으로 파일을 읽는 것은 8진수, 16진수 또는 ASCII 형식으로 파일을 보는 것과 마찬가지로 컴퓨터의 모든 파일에서 작동합니다. 모든 경우에 말이되지 않습니다.
실행 가능한 바이너리가 수행하는 작업을 이해하려면 어셈블리 언어를 표시하는 방식으로(시작으로) 이를 보아야 하며 다음 명령을 사용하여 볼 수 있습니다.
objdump -d /path/to/binary
이는 바이너리 콘텐츠를 가져와 이를 다시 어셈블러(매우 낮은 수준의 프로그래밍 언어)로 변환하는 디스어셈블러입니다. objdump
기본적으로 항상 설치되는 것은 아니므로 Linux 환경에 따라 설치가 필요할 수 있습니다.
외부 독서.
참고: @Wildcard가 지적했듯이 이러한 파일에는 다음이 포함되어 있지 않다는 점에 유의하는 것이 중요합니다.수치1과 0(화면에서 볼 수 있듯이)에는 켜짐(1) 또는 꺼짐(0)인 개별 정보 비트인 실제 디지털 데이터가 포함되어 있습니다. 이 설명조차도 진실에 대한 근사치일 뿐입니다. 중요한 점은 1과 0을 표시하는 뷰어를 찾으면 여전히 파일의 데이터를 해석하고 있더라도 0과 1의 ASCII 문자를 표시한다는 것입니다. 데이터는 이진 형식으로 저장됩니다(위의 이진수 링크 참조). Pierre-Olivier의 커뮤니티 위키 항목이에 대해 더 자세히 설명합니다.
답변3
낮은 수준에서는 파일이코딩된0과 1의 순서로.
그러나 프로그래머조차도 실제로 거기에 가는 경우는 거의 없습니다.
첫 번째(0과 1의 이야기보다 더 중요한 것은) 컴퓨터가 작동하는 모든 것은 0과 1을 사용하여 수행된다는 점을 이해해야 합니다.숫자.
문자는 문자 세트 테이블을 사용하여 숫자로 인코딩됩니다. 예를 들어, ASCII 인코딩을 사용하면 문자 "A"의 값은 65입니다. 바라보다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(16진수 표기법이 사용되므로 각 명령어에는 00부터 FF까지의 관련 숫자가 있습니다. 아래 참조)
두번째: 각 숫자는 여러 개를 가질 수 있습니다성명또는상징.
사과가 23개 있다고 가정해 보겠습니다.
- 10개의 사과를 그룹으로 나누면 10개의 사과로 구성된 2개의 그룹과 3개의 개별 사과를 얻게 됩니다. 이것이 바로 우리가 23이라고 쓸 때 의미하는 바입니다: 처음에는 2(십), 다음에는 3(일)입니다.
하지만 사과 16개 세트도 할 수 있어요. 그래서 저는 16개와 7개의 개별 사과 그룹을 얻게 됩니다. 존재하다16진수표기법(이것은 기본 16이라고 함), 나는 다음과 같이 씁니다: 17 (16 + 7). 10진수 표기법과 구별하기 위해 16진수 표기법은 일반적으로 17h, #17 또는 $17과 같은 접두사 또는 접미사로 표시됩니다. 하지만 9개 이상의 16개 그룹 또는 9개 이상의 개별 사과를 어떻게 나타낼 수 있을까요? 간단히 말해서 A(10)부터 F(15)까지의 문자를 사용합니다. 숫자 31(예: 사과 31개)은 16진수로 #1F로 표시됩니다.
같은 줄에서 두 개의 사과 그룹을 만들 수 있습니다. (그리고 두 개의 사과 그룹, 2x2 사과 그룹 등). 따라서 23은 2x2x2x2 사과 그룹 1개, 2x2x2 사과 그룹 0개, 2x2 사과 그룹 1개, 사과 2개 그룹 1개, 사과 1개이며 이진수로 10111로 표시됩니다.
(바라보다https://en.wikipedia.org/wiki/Radix)
물리적으로 두 가지 상태(전환)를 허용하는 메커니즘은 디스크와 메모리 저장소 모두에서 구현하기 쉽습니다.
이것이 데이터와 프로그램이 숫자로 취급되고 이진 형식으로 작성되고 조작되는 이유입니다.
그런 다음 데이터 유형에 따라 적절한 형식(문자 A, 노란색 픽셀)으로 변환되거나 실행(MOV 명령)됩니다.
hexdump
데이터(또는 어셈블러)를 인코딩하는 숫자를 16진수 형식으로 나열합니다. 그런 다음 계산기를 사용하여 해당 이진 형식을 얻을 수 있습니다.
답변4
일련의 16진수 값으로 표시되는 16진수 편집기에서 열 수 있습니다.xxd file
무엇을 달성하고 싶나요?