Làm thế nào để xem một tập tin nhị phân?


45

Theo những gì tôi hiểu, trình biên dịch tạo một tệp nhị phân bao gồm 1 và 0 mà CPU có thể đọc được. Tôi có một tệp nhị phân nhưng làm cách nào để mở tệp để xem số 1 và số 0 ở đó? Một trình soạn thảo văn bản nói rằng nó không thể mở nó ...

PS Tôi có một tập hợp nhị phân được biên dịch nên là mã nhị phân đơn giản của 1 và 0?


1
Khi bạn hiển thị một tệp nhị phân, bạn sẽ thấy nó dưới dạng các ký tự ascii
mazs

2
vấn đề trùng lặp stackoverflow.com/questions/1765311/
Mạnh

không - OP chỉ định "lắp ráp nhị phân biên dịch". Điều đó không giải quyết câu hỏi. Chẳng hạn, nó không phải là một tệp nhạc và nó có cấu trúc. Không có OP cung cấp thêm thông tin, một công cụ phi cấu trúc là nơi để bắt đầu.
Thomas Dickey

1
Xem câu trả lời của tôi. Và được cảnh báo rằng thuật ngữ nhị phân được sử dụng theo hai cách hoàn toàn khác nhau trong thực tế: "Tệp nhị phân" có nghĩa là một tệp có ngữ cảnh không phải là văn bản ASCII thuần túy. "Số nhị phân" có nghĩa là một số được viết bằng dạng nhị phân của nó.
Pierre-Olivier Vares

@mazs ASCII? Tôi nghĩ UTF-8 có nhiều khả năng, hoặc một số trang mã nếu chương trình nghĩ rằng nó dường như được mã hóa theo cách đó thông qua các cơn bão.
JDługosz

Câu trả lời:


99

Theo câu trả lời này của tyranid :

hexdump -C yourfile.bin 

trừ khi bạn muốn chỉnh sửa nó tất nhiên. Hầu hết các bản phân phối Linux có hexdumpmặc định (nhưng rõ ràng không phải tất cả).


Cập nhật

Theo câu trả lời này của Emilio Bool :

xxd hiện cả nhị phân và thập lục phân

Đối với thùng:

xxd -b file

Đối với hex:

xxd file

Điều này thực sự có ích! Cảm ơn bạn
Shravya Boggarapu

45

Nhiều người đã trả lời một số khía cạnh của truy vấn, nhưng không phải tất cả.

Tất cả các tệp trên máy tính được lưu trữ dưới dạng 1 và 0. Hình ảnh, tệp văn bản, âm nhạc, ứng dụng thực thi, tệp đối tượng, v.v.

Tất cả đều là 0 và 1. Sự khác biệt duy nhất là chúng được diễn giải khác nhau tùy thuộc vào những gì mở chúng.

Khi bạn xem tệp văn bản bằng cách sử dụng cat, tệp thực thi ( cattrong trường hợp này) sẽ đọc tất cả 1 và 0 và nó hiển thị chúng cho bạn bằng cách chuyển đổi chúng thành các ký tự từ bảng chữ cái hoặc ngôn ngữ có liên quan của bạn.

Khi bạn xem tệp bằng trình xem hình ảnh, nó sẽ lấy tất cả 1 và 0 và biến chúng thành một hình ảnh, tùy thuộc vào định dạng của tệp và một số logic để xử lý tất cả.

Các tệp nhị phân được biên dịch không khác nhau, chúng được lưu trữ dưới dạng 1 và 0.

Câu trả lời của arzyfex cung cấp cho bạn các công cụ để xem các tệp đó theo các cách khác nhau, nhưng đọc một tệp dưới dạng nhị phân hoạt động cho bất kỳ tệp nào trên máy tính, cũng như xem nó dưới dạng bát phân, hoặc hex, hoặc thực sự là ASCII, nó chỉ có thể không có ý nghĩa trong mỗi của những định dạng đó.

Nếu bạn muốn hiểu tệp nhị phân thực thi là gì, bạn cần xem nó theo cách hiển thị cho bạn ngôn ngữ trình biên dịch (như một sự khởi đầu), mà bạn có thể thực hiện bằng cách sử dụng,

objdump -d /path/to/binary

đó là một trình dịch ngược, nó lấy nội dung nhị phân và chuyển đổi lại thành trình biên dịch chương trình (là ngôn ngữ lập trình cấp độ rất thấp). objdumpkhông phải lúc nào cũng được cài đặt theo mặc định, vì vậy có thể cần phải được cài đặt tùy thuộc vào môi trường Linux của bạn.

Một số đọc bên ngoài.

NB: như @Wildcard chỉ ra, điều quan trọng cần lưu ý là các tệp không chứa các ký tự 1 và 0 (như bạn thấy chúng trên màn hình), chúng chứa dữ liệu số thực tế, các bit thông tin riêng lẻ nằm trên (1) hoặc tắt (0). Ngay cả mô tả đó chỉ là một sự gần đúng của sự thật. Điểm mấu chốt của chúng là nếu bạn tìm thấy trình xem hiển thị cho bạn 1 và 0, thậm chí đó vẫn đang diễn giải dữ liệu từ tệp và sau đó hiển thị cho bạn các ký tự ASCII cho 0 và 1. Dữ liệu được lưu trữ ở định dạng nhị phân ( xem liên kết số nhị phân ở trên). Mục wiki cộng đồng của Pierre-Olivier bao gồm điều này chi tiết hơn.


Tốt tiếp xúc. Bạn có thể muốn thêm rằng các ký tự mà bạn nhìn thấy trong một dòng văn bản là "1" hoặc "0" không được lưu trữ dưới dạng "1" hoặc "0" duy nhất bởi máy tính; OP dường như có một sự nhầm lẫn về điều đó.
tự đại diện

1
Tôi sẽ phân biệt (nghĩa là không đồng ý) với tuyên bố của bạn, "Khi bạn xem tệp văn bản bằng cách sử dụng cat, tệp thực thi ( cattrong trường hợp này) sẽ đọc tất cả 1 và 0 và nó trình bày chúng cho bạn bằng cách chuyển đổi chúng thành các ký tự từ bảng chữ cái có liên quan của bạn hoặc ngôn ngữ. " catkhông làm điều đó; tất cả catlà ghi byte vào đầu ra tiêu chuẩn (trừ khi bạn đang sử dụng các tùy chọn "có hại" ). Chương trình đầu cuối (và / hoặc phần cứng đầu cuối, nếu có thể, ví dụ, phần sụn của nó) xác định cách hiển thị byte dưới dạng ký tự, có thể với sự hỗ trợ từ trình điều khiển TTY.
G-Man nói 'Phục hồi Monica'

Tôi không đồng ý, nhưng tại một số điểm, tất cả các mô tả đơn giản bị phá vỡ, câu hỏi là bạn sẽ đi được bao xa lỗ thỏ trước khi bạn ngừng mô tả mọi thứ một cách đơn giản.
EightBitTony

14

Ở mức thấp, một tệp được mã hóa thành một chuỗi 0 và 1.

Nhưng ngay cả các lập trình viên hiếm khi đến đó trong thực tế.

Đầu tiên (và quan trọng hơn câu chuyện 0 và 1) này, bạn phải hiểu rằng bất cứ điều gì máy tính thao tác đều được mã hóa bằng số .

  • Một ký tự được mã hóa bằng một số, sử dụng các bảng ký tự. Ví dụ: chữ 'A' có giá trị 65 khi được mã hóa bằng ASCII. Xem http://www.asciitable.com

  • Một pixel được mã hóa bằng một hoặc nhiều số (Có rất nhiều định dạng đồ họa) Ví dụ: ở định dạng 3 màu tiêu chuẩn, một pixel màu vàng được mã hóa là: 255 cho Đỏ, 255 cho Xanh lục, 0 cho Xanh lam. Xem http://www.quackit.com/css/css_color_codes.cfm (chọn màu và xem các ô R, G & B)

  • Một tập tin thực thi nhị phân được viết bằng hội; mỗi hướng dẫn lắp ráp được mã hóa thành số. Ví dụ: hướng dẫn lắp ráp MOVB $0x61,%alđược mã hóa bởi hai số: 176,97 Xem http://www.sparksandflames.com/files/x86In cảnChart.html (Mỗi lệnh có một số liên kết từ 00 đến FF, vì ký hiệu thập lục phân được sử dụng, xem bên dưới)

Thứ hai : mỗi số có thể có nhiều biểu diễn hoặc ký hiệu .

Nói rằng tôi có 23 quả táo.

  • Nếu tôi tạo nhóm mười quả táo, tôi sẽ nhận được: 2 nhóm mười và 3 quả táo đơn độc. Đó chính xác là những gì chúng ta muốn nói khi chúng ta viết 23: a 2 (hàng chục), sau đó là 3 (đơn vị).
  • Nhưng tôi cũng có thể làm cho nhóm 16 quả táo. Vì vậy, tôi sẽ nhận được một quả táo nhóm 16 và 7 quả táo. Trong ký hiệu thập lục phân (cách gọi là 16 cơ số), tôi sẽ viết: 17 (16 + 7). Để phân biệt với ký hiệu thập phân, ký hiệu thập lục phân thường được ghi chú bằng tiền tố hoặc hậu tố: 17h, # 17 hoặc $ 17. Nhưng làm thế nào để đại diện cho hơn 9 Nhóm 16, hoặc nhiều hơn 9 quả táo một mình? Đơn giản, chúng tôi sử dụng các chữ cái từ A (10) đến F (15). Số 31 (như trong 31 quả táo) được viết là # 1F theo hệ thập lục phân.

  • Trên cùng một dòng, chúng ta có thể làm nhóm hai quả táo. (Và nhóm của hai nhóm hai quả táo, tức là nhóm 2 quả táo, v.v.). Sau đó, 23 là: 1 nhóm-2x2x2x2-táo, 0 nhóm-2x2x2-táo, 1 nhóm-2x2-táo, 1 nhóm 2 quả táo và 1 quả táo đơn lẻ sẽ được ghi chú 10111 trong nhị phân.

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

Về mặt vật lý, các cơ chế cho phép hai trạng thái (công tắc) rất dễ thực hiện, cũng như trên đĩa lưu trữ bộ nhớ.

Đó là lý do tại sao dữ liệu và chương trình, được xem là số, được viết và thao tác ở dạng nhị phân của chúng.

Sau đó được dịch - tùy thuộc vào loại dữ liệu - thành dạng thích hợp của chúng (chữ A, pixel màu vàng) hoặc được thực thi (lệnh MOV).

hexdumpliệt kê các số mã hóa dữ liệu (hoặc chương trình lắp ráp) ở dạng thập lục phân. Sau đó, bạn có thể sử dụng một máy tính để có được hình thức nhị phân tương ứng.



4

Bạn có thể mở nó trong một trình soạn thảo hex hiển thị nó dưới dạng một loạt các giá trị thập lục phân. xxd file

Bạn đang cố gắng để thực hiện?


Nhưng tôi nghĩ máy tính chỉ có thể đọc 1 và 0. Tôi có thể nhìn thấy chúng không? Tôi đang cố gắng hiểu máy tính hoạt động như thế nào
Martin Zeltin

2
Điều đó một mình sẽ không giúp bạn nhiều. Nếu bạn muốn tìm hiểu chính xác cách thức hoạt động của nó, thì trên hộp Linux, hãy xem định dạng tệp ELF và en.wikipedia.org/wiki/X86_in cản_listings . Nếu bạn chỉ muốn xem mã được trình biên dịch tạo ra, hãy xem chạy nó với gdb. Vì bạn muốn có thêm "cấp độ thấp", hãy xem nand2tetris.org. Đối với ngôn ngữ lắp ráp, tôi nghe rằng lắp ráp 6502 và mips đẹp hơn rất nhiều so với lắp ráp x86_64 / x86
theblazehen

@theblazehen Trình biên dịch gia đình x86 hiện đại là một con thú. 8086 là có thể quản lý được và tôi nghĩ rằng bất kỳ CPU nào trong khoảng thời gian đó (cuối thập niên 1970 đến nửa đầu thập niên 1980) đều có thể chấp nhận được cho đến khi nhà lắp ráp đi.
một CVn

4

bvilà một trình soạn thảo Binary VIsual với các phím bấm vim. Nó có sẵn trên hầu hết các hệ thống linux.

nhập mô tả hình ảnh ở đây


3

Lệnh chuỗi Linux in chuỗi ký tự có thể in trong tệp, ví dụ:

$ 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

vv ... nó khá dễ đọc hơn nhị phân.


OP hỏi làm thế nào để tôi mở nó để xem số 1 và số 0 ở đó? nhưng stringslệnh sẽ loại bỏ hầu hết các byte mà anh ta muốn xem.
jlliagre

@jlliagre - trong khi bạn là chính xác, các stringslệnh - đặc biệt là với chiều dài còn như strings -n 6- thực sự giúp tìm ra những gì một tập tin nhị phân có trong nó nếu nó chứa bất kỳ hằng chuỗi, vv .. Câu trả lời này cần phải có được một nhận xét, sau đó nó sẽ đã ổn
Joe

@Joe Vâng, tôi không đặt câu hỏi về stringstính hữu dụng của lệnh, chỉ là thực tế nó không trả lời câu hỏi OP ở đây.
jlliagre

3

Một phần quan trọng mà bạn vẫn có vẻ bối rối: Các giá trị thập lục phân chỉ là một đại diện khác nhau của các giá trị nhị phân. Hầu hết các trình soạn thảo hex hoặc hexdumps sẽ hiển thị các giá trị trong cơ sở thập lục phân, bởi vì nó dễ đọc hơn trong cơ sở nhị phân.

Ví dụ:

Nhị phân:

xxd -b README.md                                                                
00000000: 00100011 00100000

Đó là số thập phân 35 và 32

xxd README.md                                                                   
00000000: 2320

Số thập phân 35 và 32


Những người khác đã đề cập đến điều này. Tuy nhiên, đây là một bản tóm tắt tốt. Bạn có thể chỉnh sửa câu trả lời của mình nếu bạn muốn thay đổi đoạn đầu tiên.
wizzwizz4

Rất tốt, tôi chưa thấy ai nhắc đến nó, tôi có thể đã bỏ lỡ nó.
Thứ năm

Lưu ý rằng bạn cần vimcài đặt để sử dụng xxd.
starbeamrainbowlabs

2

Bạn có thể xem tệp ở dạng nhị phân trong vim, bởi:

  • Mở tệp trong vim
  • Đang vào :% !xxd -b

Các xxdlệnh có thể được tinh chỉnh hơn nữa, ví dụ:

  • Bằng cách thêm -g4, nhóm này sẽ nhóm các bit trong gói 32 bit
  • Bằng cách thêm -c4, sẽ định dạng đầu ra, để có 4 byte trên mỗi dòng

Thêm cả hai cờ ở trên, sẽ cung cấp cho bạn một số nguyên 32 bit trên mỗi dòng.


1

Bạn có thể làm điều đó với ví dụ, lớp lót ruby ​​này:

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

Hệ thống dựa trên C truyền thống có hỗ trợ tệ hại cho việc xuất các thứ ở dạng nhị phân, AFAIK. Nó thường không hữu ích lắm vì nó khá khó đọc không giống như các thập lục phân.


Cảm ơn! Thêm một khoảng trắng trực tiếp sau khi %08bkhiến nó nhóm đầu ra thành byte.
starbeamrainbowlabs

0

GHex là bạn của bạn :)
Bạn có thể cài đặt nó bằng dòng lệnh

Ubuntu:

sudo apt-get cài đặt ghex

Fedora:

sudo yum cài đặt ghex

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.