2011-07-26 107 views
19

Hết sức tò mò, mã nhị phân được chuyển đổi thành chữ cái chính xác như thế nào? Tôi biết có những trang web tự động chuyển đổi nhị phân thành các từ cho bạn nhưng tôi muốn hiểu các bước trung gian cụ thể mà mã nhị phân trải qua trước khi được chuyển đổi thành chữ cái.Mã nhị phân chính xác được chuyển thành chữ cái như thế nào?

+0

Bạn có ý nghĩa gì với mã nhị phân? Bạn có nghĩa là từ một mã ASCII để thư tương ứng? – Giorgio

Trả lời

17

Giả sử rằng bằng "mã nhị phân", bạn có nghĩa là dữ liệu cũ thuần túy (chuỗi bit hoặc byte) và bằng "chữ cái" nghĩa là các ký tự, câu trả lời là hai bước. Nhưng trước tiên, một số nền tảng.

  • Ký tự chỉ là biểu tượng được đặt tên, như "THƯ VỐN LATIN A" hoặc "GỌI NHỎ PI" hoặc "BLACK CHESS KNIGHT". Đừng nhầm lẫn một ký tự (biểu tượng trừu tượng) với glyph (ảnh của một ký tự).
  • A bộ ký tự là một tập hợp các ký tự cụ thể, mỗi ký tự được liên kết với một số đặc biệt, được gọi là mã số của nó. Để xem ánh xạ điểm mã trong bộ ký tự Unicode, xem http://www.unicode.org/Public/UNIDATA/UnicodeData.txt.

Được rồi bây giờ đây là hai bước sau:

  1. Các dữ liệu, nếu nó là văn bản, phải được đi kèm bằng cách nào đó bởi một mã hóa nhân vật, một cái gì đó như UTF-8, Latin-1, US-ASCII, vv Mỗi lược đồ mã hóa ký tự chỉ rõ chi tiết cách các chuỗi byte được hiểu là các điểm mã (và ngược lại cách các chuỗi mã được mã hóa như các chuỗi byte).

  2. Khi chuỗi byte được hiểu là điểm mã, bạn có ký tự của bạn, bởi vì mỗi ký tự có một điểm cụ thể.

Một vài lưu ý:

  • Trong một số mã hóa, chuỗi byte nhất định tương ứng với không codepoints ở tất cả, vì vậy bạn có thể có sai sót nhân vật giải mã.
  • Trong một số bộ ký tự, có các điểm mã hóa không được sử dụng, nghĩa là chúng không tương ứng với bất kỳ ký tự nào.

Nói cách khác, không phải mọi chuỗi byte đều có nghĩa là văn bản.

+0

Phản hồi rất sáng suốt. Có kiến ​​thức quan trọng, sẽ được đưa vào sử dụng tốt. –

7

Bạn có nghĩa là chuyển đổi 011001100110111101101111foo chẳng hạn? Bạn chỉ cần lấy luồng nhị phân, chia nó thành các byte riêng biệt (01100110, 01101111, 01101111) và tìm kiếm ký tự ASCII tương ứng với số đã cho. Ví dụ, 01100110 là 102 trong hệ thập phân và các ký tự ASCII với mã 102 là f:

$ perl -E 'say 0b01100110' 
102 
$ perl -E 'say chr(102)' 
f 

(See what the chr function does.) Bạn có thể khái quát thuật toán này và có một số khác nhau của các bit cho mỗi ký tự và mã hóa khác nhau, những gì còn lại điểm giống nhau.

0

Tại sao không chỉ thực hiện việc này, hãy chia 010010001001001 thành hai bit 8 chữ cái (01001000, 01001001). Sau đó ban hành các cường quốc

01001000. 01001001.

Đã có 8 đầu tiên bỏ qua ba đầu tiên họ xác định xem đó là vốn hay không, đường đi phải sang trái, quyền hạn làm 2 (2^1, 2^2 2^3 2^4 2^5). Vì vậy, sau đó thêm tất cả những người lên, chỉ có một, và nó = 8, và te tám chữ cái trong bảng chữ cái là h vì vậy bit đầu tiên của chúng tôi là chữ h, hãy thử nó trên bit khác

16

Đây là một cách để chuyển đổi các số nhị phân thành các ký tự ASCII thường đủ đơn giản để thực hiện trong đầu của bạn.

1 - Chuyển đổi mọi 4 chữ số nhị phân thành một chữ số hex.

Dưới đây là một số nhị phân để biểu đồ chuyển đổi hex:

0001 = 1 
0010 = 2 
0011 = 3 
0100 = 4 
0101 = 5 
0110 = 6 
0111 = 7 
1000 = 8 

1001 = 9 
1010 = a (the hex number a, not the letter a) 
1011 = b 
1100 = c 
1101 = d 
1110 = e 
1111 = f 

(Các con số thập lục phân từ a tới f là số thập phân 10 đến 15. Đó là những gì hệ thập lục phân, hay "cơ sở 16" là - thay vì mỗi chữ số có khả năng biểu diễn 10 số khác nhau [0 - 9], như số thập phân hoặc "cơ sở 10", mỗi chữ số thay vì có khả năng biểu thị 16 số khác nhau [0 - f].)

Khi bạn biết biểu đồ đó, chuyển đổi bất kỳ chuỗi chữ số nhị phân nào vào một chuỗi các chữ số thập phân đều rất đơn giản.

Ví dụ,

01000100 = 0100 0100 = 44 hex 
1010001001110011 = 1010 0010 0111 0011 = a273 hex 

đơn giản đủ, đúng không? Nó là một vấn đề đơn giản để chuyển đổi một số nhị phân của bất kỳ chiều dài thành tương đương hệ thập lục phân của nó.

(Điều này hoạt động vì hệ thập lục phân là cơ số 16 và nhị phân là cơ sở 2 và 16 là lũy thừa thứ 4 của 2, vì vậy phải mất 4 chữ số nhị phân để tạo 1 chữ số thập phân. 10, mặt khác, không phải là sức mạnh của 2, vì vậy chúng tôi không thể chuyển đổi nhị phân thành số thập phân gần như dễ dàng.)

2 - Tách chuỗi các chữ số hex thành các cặp.

Khi chuyển đổi một số thành ASCII, mỗi 2 chữ số thập phân là một ký tự. Vì vậy, phá vỡ chuỗi hex thành bộ gồm 2 chữ số.

Bạn sẽ chia một số hex như 7340298b392 này thành 6 cặp, như thế này:

7340298b392 = 07 34 02 98 b3 92 

(Chú tôi thêm vào phía trước một 0, vì tôi đã có một số lẻ của các chữ số hex.)

Đó là 6 cặp chữ số hex, vì vậy nó sẽ có 6 chữ cái. (Ngoại trừ tôi biết ngay rằng 98, b3 và 92 không phải là chữ cái. Tôi sẽ giải thích tại sao sau một phút.)

3 - Chuyển đổi từng cặp chữ số thập phân thành số thập phân.

Thực hiện việc này bằng cách nhân chữ số còn lại (số thập phân của chữ số) với 16 và thêm số thứ hai. Ví dụ, b3 hex = 11 * 16 + 3, là 110 + 66 + 3, là 179. (b hex là 11 thập phân.)

4 - Chuyển đổi số thập phân sang ký tự ASCII.

Bây giờ, để lấy các chữ cái ASCII cho các số thập phân, chỉ cần nhớ rằng trong ASCII, 65 là chữ hoa 'A' và 97 là chữ thường 'a'.

Vì vậy, thư nào là 68?

68 là chữ cái thứ 4 của bảng chữ cái viết hoa, phải không?
65 = A, 66 = B, 67 = C, 68 = D.

Vì vậy, 68 là 'D'.

Bạn lấy số thập phân, trừ 64 cho chữ in hoa nếu số nhỏ hơn 97 hoặc 96 cho chữ thường nếu số từ 97 trở lên và đó là số chữ cái của bảng chữ cái được liên kết với bộ đó của 2 chữ số thập phân.


Ngoài ra, nếu bạn không sợ một chút dễ dàng hex số học, bạn có thể bỏ qua bước 3, và chỉ cần đi thẳng từ hex để ASCII, bằng cách ghi nhớ, ví dụ, rằng

hex 41 = 'A' 
hex 61 = 'a' 

Vì vậy, trừ 40 hex cho chữ in hoa hoặc 60 hex cho chữ cái thường và chuyển đổi những gì còn lại thành thập phân để nhận số chữ cái alphabet.

Ví dụ

01101100 = 6c, 6c - 60 = c = 12 decimal = 'l' 
01010010 = 52, 52 - 40 = 12 hex = 18 decimal = 'R' 

(Khi làm điều này, nó rất hữu ích để nhớ rằng 'm' (hoặc 'M') là lá thư 13 của bảng chữ cái. Vì vậy, bạn có thể đếm lên hoặc xuống từ 13 đến . tìm thấy một lá thư đó là gần đến giữa hơn để hai đầu)

tôi thấy điều này trên một chiếc áo một lần, và đã có thể đọc nó trong đầu tôi:

01000100 
01000001 
01000100 

tôi đã làm nó như thế này:

01000100 = 0100 0100 = 44 hex, - 40 hex = ucase letter 4 = D 
01000001 = 0100 0001 = 41 hex, - 40 hex = ucase letter 1 = A 
01000100 = 0100 0100 = 44 hex, - 40 hex = ucase letter 4 = D 

Áo sơ mi nói "DAD", mà tôi nghĩ là khá tuyệt, vì nó được mua bởi một người phụ nữ mang thai. Chồng cô ấy phải là một người đam mê như tôi.


Làm cách nào tôi biết ngay rằng 92, b3 và 98 không phải là chữ cái?

Bởi vì mã ASCII cho chữ thường 'z' là 96 + 26 = 122, trong hex là 7a. 7a là số hex lớn nhất cho một chữ cái. Bất cứ điều gì lớn hơn 7a không phải là một lá thư.


Vì vậy, đó là cách bạn có thể làm điều đó như một con người.

Chương trình máy tính làm như thế nào?

Đối với mỗi bộ 8 chữ số nhị phân, hãy chuyển đổi nó thành một số và tra cứu nó trong bảng ASCII.

(Đó là một cách khá rõ ràng và thẳng về phía trước) Một lập trình viên điển hình có thể nghĩ đến 10 hoặc 15 cách khác trong không gian vài phút, chi tiết phụ thuộc vào môi trường ngôn ngữ máy tính.)

+0

cảm ơn. Tôi tìm thấy nó dễ dàng hơn để đọc mà không có các chữ số hex, aka xem byte '01000100' là' 2^6 + 2^2' = 68 trực tiếp. – Blauhirn

+0

Thú vị. Hãy xem, tôi đoán chữ số đúng nhất là 2^0, vì vậy 2^6 là chữ số thứ 7 từ bên phải. 2^6 là .. 2,4,8,16,32,64 .. và 2^2 là 2 * 2 là 4, vì vậy, phải, đó sẽ là 68. Mã Ascii là 8 bit rộng, vì vậy tôi đoán nếu bạn biết các quyền hạn của 2 ra đến 7 bit (kể từ 01111010 là lá thư lớn nhất), phương pháp đó có thể được thực hiện đủ, mặc dù một cái gì đó như 01011010 có thể mất nhiều thời gian hơn là nếu bạn chỉ biết các chữ số hex ra 4 bit; 0101 = 5, 1010 = A, vì vậy 5A. Chuyển đổi thành chữ cái: 0x5A - 0x40 (chữ cái viết hoa) = 0x1A = 16 + 10 = 26 (bằng chữ in hoa) = 'Z'. – Shavais

+0

Nếu bạn thực sự thích làm việc trong thập phân, tôi đoán bạn thực sự có thể biết giá trị thập phân trong 4 bit và cho mỗi bộ 8 bit, nhân bộ còn lại 16 và thêm tập thứ hai. Vì vậy, 0101: 1010 = 5:10 = 5 * 16 + 10 = 50 + 30 + 10 = 90. Nếu bạn biết 64 là số thập phân để trừ cho chữ in hoa, bạn nhận được 26 ('Z') theo cách đó. – Shavais

Các vấn đề liên quan