ENDIAN LÀ GÌ

     

Bài viết gốc: https://manhhomienbienthuy.bitbucket.io/2018/Sep/20/little-endian-vs-big-endian.html (đã xin phép người sáng tác

*

)

Little endian cùng big endian, đấy là hai phương thức khác nhau để lưu trữ dữ liệu dạng nhị phân (binary). Thông thường thì bọn họ cũng chẳng cần suy nghĩ chúng có tác dụng gì. Vày mọi việc sẽ được auto hoá hết.Bạn đã xem: Big endian là gì

Thế nhưng có những tình huống, ví dụ như khi cần xử lý những tập tin tất cả cấu trúc, tập tin binary, độc nhất là rất nhiều tập tin được ghi bằng ngôn từ khác, thì bài toán hiểu về little endian với big endian là siêu quan trọng. Bởi vì nếu không, rất bao gồm thể bọn họ sẽ gọi sai sản phẩm tự và xử lý với tài liệu được hiểu sai.

Bạn đang xem: Endian là gì

Dữ liệu

Dữ liệu là mô tả của tin tức dưới dạng tàng trữ được. Tin tức là vật dụng trừu tượng, không tồn tại hình dạng, kia là phần nhiều hiểu biết về những sự vật, vấn đề xung quanh chúng ta. Để giữ trữ, tương tự như truyền đạt thông tin đến phần lớn người, chúng ta cần mang lại dữ liệu. Dữ liệu hoàn toàn có thể là chữ viết, hình ảnh được ghi bên trên giấy, vớ cả chúng ta dữ liệu mà nhỏ người có thể hiểu được.

Nhưng những tài liệu đó rất cần được được mã hoá một lượt nữa, nếu họ muốn lưu trữ chúng trên lắp thêm tính. Như họ đều biết, laptop chỉ làm việc với dữ liệu được mã hoá dưới dạng nhị phân, vậy buộc phải mọi dữ liệu rất cần được mã hoá thành nhị phân mới rất có thể xử lý trên máy vi tính được.

Thực ra vấn đề đó chỉ đúng với máy tính số (digital electronic computer). Nghe nói bây chừ máy tính lượng tử, máy vi tính sinh học cũng đang được phát triển, hy vọng trong vài năm tới, chúng ta sẽ update lại kiến thức và kỹ năng về dữ liệu.

Thực ra, vật dụng tính không hiểu biết được các ký trường đoản cú 0, 1 trong hệ nhị phân đâu, nó hoạt động theo các tín hiệu năng lượng điện tử. Tế bào tả đúng chuẩn thì khôn xiết khó, nhưng bạn có thể hiểu "sơ sơ" rằng, chạm mặt bit 1 thì sẽ sở hữu dòng diện, chạm chán bit 0 thì không có. Như vậy, các bit 0, 1 được giải pháp xử lý thành những tín hiệu năng lượng điện tử tương ứng, và bọn họ coi đó như máy vi tính đã đọc được dữ liệu nhị phân.

Thế nhưng, tuy nhiên cùng áp dụng tín hiệu dạng nhị phân, những máy tính không giống nhau cũng không thực sự nói tầm thường một ngôn ngữ. Cũng giống như coi người vậy, khi nhìn các ký trường đoản cú a, b, c có người hiểu, có người không. Máy tính khi nhìn vào các tín hiệu tương xứng với những ký hiệu 0 giỏi 1, mỗi trang bị tính hoàn toàn có thể hiểu theo một cách khác nhau.

Thế nhưng, khôn xiết may là các máy tính xách tay vẫn hoạt động theo phần nhiều tiêu chuẩn chung, thế nên nó vẫn có thể giao tiếp với nhau được. Tuy nhiên, xem xét rằng, không phải bất kể lúc nào, các máy tính xách tay cũng hoàn toàn có thể hiểu được lẫn nhau.

Trong thiết bị tính, những dữ liệu nhị phân không được xử trí theo từng bit riêng lẻ, nhưng mà được cách xử trí thành từng khối 8 bit một, và đơn vị xử lý nhỏ dại nhất này call là byte.

Ví dụ, số nguyên 123456789 được biểu diễn dưới dạng nhị phân vẫn là (ở trên đây tôi cho rằng kiểu tài liệu int đang có form size là 4 byte, mặc dù nhiên, nhiều khối hệ thống 64 bit đã nâng size này lên 8 byte)

00000111 01011011 11001101 00010101Để ngắn gọn, bạn có thể viết nó bên dưới dạng hexa như sau:

07 5b cd 15Đã gồm bao giờ, bạn tự hỏi, khi ghi tài liệu này trên đĩa cứng chẳng hạn, nó được ghi nỗ lực nào chưa. Bạn cho rằng, nó sẽ tiến hành ghi theo thứ tự theo sản phẩm công nghệ tự mà chúng ta đang đọc cùng viết ngơi nghỉ trên, thì chúng ta đã nhầm.

Đây là phương pháp viết theo phong cách số Ả rập cho bọn họ dễ phát âm thôi, laptop không "đọc" những ký tự giống như bọn họ nên nó cũng không tàng trữ giống cách họ viết các ký tự này ra đâu. Câu hỏi ghi dữ liệu như thế nào đó là lúc little endian cùng big endian được sử dụng đến.

Little endian và big endian là gì?

Little endian và big endian là hai phương thức khác biệt để lưu trữ dữ liệu. Sự khác hoàn toàn của little endian cùng big endian khi lưu trữ đó là ở việc thu xếp thứ tự các byte dữ liệu.

Trong cơ chế tàng trữ little endian (xuất phát từ "little-end" nghĩa kết thúc nhỏ tuổi hơn), byte cuối cùng trong màn biểu diễn nhị phân trên sẽ được ghi trước. Lấy ví dụ như 123456789 ghi theo kiểu little endian đang thành

15 cd 5b 07Hơi ngược một chút ít đúng không? Big endian (xuất phân phát từ "big-end") thì ngược lại, là phép tắc ghi tài liệu theo trang bị tự bình thường mà chúng ta vẫn dùng. 123456789 được lưu trữ vẫn theo như đúng thứ từ bỏ là

07 5b cd 15Các thuật ngữ big-end hay little-end bắt đầu từ cuốn tè thuyết Gulliver du cam kết (Gulliver"s Travels), trong những số ấy nhân vật Lilliputans tranh cãi về câu hỏi nên đập trứng bằng đầu to tốt nhỏ.

Và ngành IT đã áp dụng thuật ngữ ngày, tương đối giống với nghĩa gốc. để ý rằng, little endian hay big endian chỉ không giống nhau ở bí quyết sắp xếp các byte dữ liệu, còn lắp thêm tự từng bit vào byte thì tương đương nhau. Rất may, các máy tính vẫn có điểm trung này.

Thêm một để ý nữa rằng, little endian giỏi big endian chỉ biệt lập khi cần tàng trữ những dữ liệu có tương đối nhiều byte. Những dữ liệu chỉ có một byte (ví dụ ký tự ASCII) thì không tác động gì (chính xác là cho dù dùng cách tiến hành nào kết quả cũng như nhau)

Little endian với big endian được dùng trên những laptop nào?

Việc sắp đến xếp các byte dữ liệu theo giao diện little endian hay big endian không chỉ là xảy ra khi bọn họ lưu trữ dữ liệu ra bộ nhớ ngoài. Mọi hoạt động vui chơi của máy tính gần như sử dụng tài liệu nhị phân, đề nghị little endian/big endian tồn tại trong mọi buổi giao lưu của máy tính.

Ngoài việc áp dụng little endian/big endian 1 phần phụ thuộc vào ứng dụng (do lập trình sẵn viên nạm ý sử dụng một trong các hai loại, hoặc ngôn ngữ lập trình điều khoản trước), nó còn phụ thuộc vào cỗ vi giải pháp xử lý của chính máy tính đó.

Các bộ vi giải pháp xử lý Intel đều áp dụng little endian, những bộ vi cách xử lý cả ARM trước đó cũng là little endian, nhưng mà hiện này ARM đã upgrade vi xử lý của chính bản thân mình thành bi-endian (tức là xử trí cả little endian với big endian).

Các cỗ vi cách xử trí PowerPC cùng SPARK trước đây đều là big endian, nhưng hiện thời chúng cũng được nâng cung cấp thành bi-endian.

Các làm nào thì xuất sắc hơn: little endian xuất xắc big endian?

Little endian tuyệt big endian cũng tương tự tranh luận nơi bắt đầu về việc đập trứng, không tồn tại một cách làm nào thực sự tốt hơn thủ tục nào.

Little endian xuất xắc big endian chỉ khác nhau ở việc tàng trữ thứ tự các byte dữ liệu. Cả nhị phương thức số đông không làm ảnh hưởng đến tốc độ xử lý của CPU. Thế cho nên cả hai phương thức phần đa vẫn tồn tại tuy nhiên song với sẽ không bao giờ có thể bao gồm một câu vấn đáp thoả đáng: phương thức nào thì tốt hơn?

Mỗi phương thức đều sở hữu những lợi thế nhất định. Cùng với little endian, bởi vì byte nhỏ nhất luôn luôn nằm bên trái, nó sẽ mang đến phép bọn họ đọc dữ liệu với độ dài tuỳ ý. Nó đang rất phù hợp nếu bọn họ cần nghiền kiểu, ví dụ từ int thành long int.

Với trả định int là 4 byte, long int là 8 byte, nếu cần sử dụng little endian, khi xay kiểu, địa chỉ bộ nhớ không cần phải thay đổi, bọn họ chỉ cần ghi tiếp các byte lớn hơn mà thôi.

Nhưng ví như cũng trường hợp đó, mà sử dụng big endian, thì họ sẽ buộc phải dịch showroom bộ nhớ bây giờ thêm 4 byte nữa new có không gian để giữ trữ.

Nhưng big endian cũng có nhưng điểm mạnh nhất định, với bài toán đọc tài liệu byte lớn số 1 trước, nó đã rất thuận lợi kiểm tra một trong những là âm tuyệt dương, do byte đựng dấu được phát âm đầu tiên.

Xem các byte tài liệu trong bộ nhớ

#include /* function to lớn show bytes in memory, from location start lớn start+n */voidshow_mem_rep (char *start, int n) int i; for (i = 0; i n; i++) printf (" %.2x", start); printf (" ");/* Main function to hotline above function for 0x01234567 */intmain () int i = 0x01234567; show_mem_rep ((char *) &i, sizeof (i)); return 0;Khi thực thi chương trình trên, trường hợp máy của khách hàng là little endian thì tác dụng sẽ là

67 45 23 01còn nếu máy chúng ta là big endian thì nó đã hiển thị theo máy tự thông thường

01 23 45 67Có phương pháp nào để khẳng định máy tính của chúng ta là little endian tốt big endian xuất xắc không? gồm vô số các cách khác nhau, dưới đó là một trong số những biện pháp đó:

#include intmain () unsigned int i = 1; char *c = (char *) &i; if (*c) printf ("Little endian"); else printf ("Big endian"); return 0;Với đoạn code đơn giản dễ dàng trên, c là bé trỏ, nó trỏ đến vùng nhớ của thay đổi i là một trong những nguyên. Cũng chính vì số nguyên là kiểu tài liệu nhiều byte, vào khí tài liệu của char chỉ là 1 trong những byte mà lại thôi, bắt buộc *c sẽ trả về quý giá là byte thứ nhất của số nguyên i.

Xem thêm: Tác Dụng Của Tinh Chất Catechin Là Gì, Catechin Là Gì

Nếu laptop của họ là little endian thì byte đầu tiên này sẽ là 1, trái lại thì nó sẽ là 0.

Điều này tác động thế nào đến việc lập trình

Về cơ bạn dạng thì little endian hay big endian ko có ảnh hưởng lắm tới việc lập trình. Phần lớn các xây dựng viên ko cần niềm nở nhiều lắm, vày mọi bài toán đã được các trình biên dịch/thông dich phụ trách hết.

Tuy nhiên, một vài trường hợp, chúng ta cần quan liêu tâm, đặc biệt quan trọng khi chuyển đổi dữ liệu giữa các máy tính khác nhau. Ví dụ: khi chúng ta cần giải pháp xử lý một tệp tin có cấu tạo thế này, 4 byte đầu tiên là một số nguyên n, tiếp nối là n số nguyên, từng số chiếm 4 byte cỗ nhớ, v.v...

Trong trường hòa hợp này, khi dấn file được tạo ra từ một máy vi tính khác, việc nó được ghi theo kiểu little endian tốt big endian ví dụ là ảnh hưởng rất nghiêm trọng, nếu sử dụng sai phương thức, bọn họ sẽ thu về dữ liệu sai.

Một trường vừa lòng khác nữa rất có thể xảy ra vấn đề là khi chúng ta ép kiểu cho các biến

#include intmain () unsigned char arr = 0x01, 0x00 ; unsigned short int x = *(unsigned short int *) arr; printf ("%d", x); return 0;Trong đoạn code trên, chúng ta đã ép kiểu dáng một array hai bộ phận char thành một số nguyên 2 byte (short int). Trong lấy ví dụ này, little endian tốt big endian cũng có ảnh hưởng rất lớn.

Một máy vi tính dùng little endian đã có hiệu quả là một trong những khi big endian vẫn cho hiệu quả là 256. Để tránh đều lỗi đáng tiếc có thể xảy ra, gần như code như trên rất cần được tránh.

Vấn đề NUXI

NUXI là một vấn đề rất nổi tiếng liên quan mang lại little endian và big endian: UNIX được lưu giữ trong một khối hệ thống big-endian sẽ tiến hành hiểu là NUXI vào một khối hệ thống little endian.

Giả sử chúng ta cần tàng trữ 4 byte (U, N, I, X) bởi hai số nguyên dạng short int: UN với IX.

#include intmain () short int *s; // pointer lớn set shorts s = (short int *)malloc(sizeof(short int)); // point khổng lồ location 0 *s = "UN"; // store first short: U * 256 + N (fictional code) s += 2; // point to lớn next location *s = "IX"; // store second short: I * 256 + X return 0;Đoạn code trên trả toàn chủ quyền với hệ thống, bất kỳ nó là little tuyệt big endian. Nếu bọn họ lưu trữ các giá trị "UN" và "IX" khi đọc ra, nó vẫn đã là "UNIX" tốt không? trường hợp mọi bài toán chỉ xảy ra trên một lắp thêm tính, dù là big endian xuất xắc little endian thì nó sẽ luôn là như vậy, vì chưng mọi thứ đã được tự động hoá giúp bọn chúng ta.

Với bất cứ dữ liệu nào cũng vậy, chúng ta luôn thu được tài liệu đúng giả dụ đọc cùng ghi trong và một hệ thống. Cầm cố nhưng, hãy chú ý kỹ hơn về việc sắp xếp các byte trong cỗ nhớ.

Một hệ thống big endian sẽ lưu trữ như sau:

U N I XCòn một hệ thống little endian thì vẫn như sau:

N U X IMặc mặc dù trông hơi ngược nhưng hệ thống little endian đang xử lý vấn đề đọc giúp bọn chúng ta, nên lưu trữ như vậy cơ mà khi rước ra bọn họ vẫn có dữ liệu ban đầu. Mặc dù vậy khi bọn họ ghi tài liệu này ra file, đưa sang một laptop khác. Với mỗi máy vi tính lại xử lý theo phong cách riêng của chính nó thì UNIX trên sản phẩm big endian sẽ được hiểu là NUXI trên sản phẩm little endian (và ngược lại).

Đây đó là vấn đều gian nguy nhất khi bọn họ trao đỏi dữ liệu qua lại giữa các máy vi tính với nhau, đặc biệt quan trọng trong thời đại mạng internet ngày nay.

Trao đổi tài liệu giữa các máy tất cả endian khác nhau

Ngày nay, mọi laptop đều được kết nối để trao đổi dữ liệu với nhau. Little endian xuất xắc big endian cũng đầy đủ phải thương lượng với nhau, tuy thế làm chũm nào để có hiểu được nhau khi chúng không nói bình thường một thứ tiếng?

Có 2 chiến thuật chính cho vấn đề này

Sử dụng chung định dạng

Một phương án dễ dàng nhất tất cả sử dụng bình thường một định dang lúc truyền dữ liệu.

Ví dụ đều tập tin dạng PNG đều cần phải sử dụng big endian. Tương tự như với các tập tin có cấu tạo khác. Đó là vì sao vì sao chúng ta nhiều khi cần được dùng những phần mềm chuyên sử dụng để đọc với ghi các file này.

Thế nhưng trong kết nối với Internet, bài toán truyền tài liệu còn phức tạp hơn thế. Họ không thể cứ cần sử dụng một định dạng file nào đó, rồi truyền từng byte một sang máy khác được. ước ao tăng tốc độ, bắt buộc bọn họ phải truyền các byte một lúc.

Và lúc đó họ cần tất cả một chuẩn chỉnh chung. Hiện nay, chuẩn chỉnh chung cho việc truyền dữ liệu trên mạng, điện thoại tư vấn là network byte order chính là big endian. Cố gắng nhưng, cho dù đã chuẩn chỉnh chung rồi, thỉnh thoảng vẫn đang còn những giao thức chơi chội hơn, sử dụng little endian.

Để bao gồm thể biến hóa dữ liệu thành dữ liệu chuẩn chỉnh theo network byte order, chương trình cần gọi hàm hton* (host-to-network) (trong ngôn từ C). Trong hệ thống big endian, hàm này không cần làm gì cả, còn little endian sẽ tiến hành chuyển đối các byte một chút.

Dù khối hệ thống big endian không cần thay đổi dữ liệu, vấn đề gọi hàm này vẫn luôn là rất nên thiết. Công tác của bạn cũng có thể được viết bằng một ngữ điệu (C) nhưng có thể được dịch và triển khai ở nhiều hệ thống khác nhau, vấn đề gọi hàm này vẫn giúp bọn họ làm điều đó.

Tương tự, ở chiều ngược lại, bọn họ cần điện thoại tư vấn hàm ntoh* để đổi khác dữ liệu nhận ra từ mạng về dữ liệu máy tính rất có thể hiểu được. Ngoài ra, bọn họ còn phải hiểu rõ kiểu tài liệu mà chúng ta cần đổi khác nữa, danh sách những hàm biến đổi như sau:

htons - "Host to Network Short"htonl- "Host to Network Long"ntohs - "Network to Host Short"ntohl - "Network to Host Long"

Những hàm này vô cùng quan trọng khi thực hiện chia đã dữ liệu tại tầng thấp, lấy ví dụ như khi bình chọn checksum của những gói tin chẳng hạn. Nếu không làm rõ về little endian với big endian thì khi cần thao tác làm việc về mạng, các bạn sẽ gặp các khó khăn.

Sử dụng BOM (Byte Order Mark)

Một phương án khác để giải quyết sự khác biệt về endian là sử dụng BOM (Byte Order Mark). Đây là một trong những ký tự quánh biệt, có giá trị là 0xFEFF, được ghi nghỉ ngơi vị trí đầu tiên của file.

Nếu bạn đọc ký tự này là 0xFFFE (bị ngược) thì gồm nghĩa tệp tin này được ghi với endian không giống với khối hệ thống của bạn, lúc đó, bạn sẽ cần phải biến đổi phương thức đọc dữ liệu một chút.

Có một vài ba vấn đề nhỏ với việc sử dụng BOM. Sản phẩm nhất, BOM sẽ gây tăng tài liệu được ghi vào file. Ngay cả khi bọn họ chỉ giữ hộ đi 2 byte dữ liệu, chúng ta vẫn yêu cầu thêm 2 byte BOM nữa.

Xem thêm: Top 9 App Tập Thể Dục Tăng Chiều Cao, Cao Hơn, Height Increase Trên App Store

Thứ hai, BOM không hoàn toàn thần thánh, bởi vì nó phụ trực thuộc vào xây dựng viên. Có người dân có tâm thì phát âm và cách xử trí khi chạm mặt BOM, có fan thì trọn vẹn bỏ quên nó cùng coi nói như tài liệu thông thường. Unicode thực hiện BOM khi tàng trữ dữ liệu nhiều byte (nhiều cam kết tự Unicode được mã hoá thành 2, 3 thậm chí là 4 byte).