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 và big endian, đây là hai phương thức khác biệt để tàng trữ dữ liệu dạng nhị phân (binary). Thông thường thì chúng ta cũng chẳng cần để ý đến chúng có tác dụng gì. Vị mọi câu hỏi sẽ được tự động hóa hoá hết.Bạn đang xem: Endian là gì

Thế nhưng bao gồm tình huống, lấy ví dụ khi yêu cầu xử lý những tập tin bao gồm cấu trúc, tập tin binary, duy nhất là mọi tập tin được ghi bằng ngôn từ khác, thì việc hiểu về little endian với big endian là cực kỳ quan trọng. Bởi vì nếu không, rất có thể bọn họ sẽ hiểu sai lắp thêm tự và xử lý với dữ liệu được đọc sai.Bạn vẫn xem: Endian là gì

Dữ liệu

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

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

Nhưng những dữ liệu đó rất cần được được mã hoá một lần nữa, nếu họ muốn tàng trữ chúng trên thiết bị tính. Như bọn họ đều biết, máy vi tính chỉ làm việc với tài liệu được mã hoá bên dưới dạng nhị phân, vậy bắt buộc mọi dữ liệu rất cần phải 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 đề này chỉ đúng với laptop số (digital electronic computer). Nghe nói bây giờ máy tính lượng tử, laptop sinh học tập cũng đang được phát triển, hy vọng trong vài năm tới, họ sẽ update lại kiến thức và kỹ năng về dữ liệu.

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

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

Thế nhưng, cực kỳ may là các máy vi tính vẫn hoạt động theo số đông tiêu chuẩn chỉnh chung, thế nên nó vẫn hoàn toàn có thể giao tiếp với nhau được. Tuy nhiên, chú ý rằng, ko phải bất kể lúc nào, các máy tính cũng hoàn toàn có thể hiểu được lẫn nhau.

Trong máy tính, những dữ liệu nhị phân ko được cách xử lý theo từng bit riêng biệt lẻ, mà lại được giải pháp xử lý thành từng khối 8 bit một, và đơn vị chức năng xử lý nhỏ tuổi nhất này điện thoại tư vấn là byte.

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

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

07 5b cd 15Đã có 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. Các bạn cho rằng, nó sẽ được ghi lần lượt theo đồ vật tự mà chúng ta đang đọc với viết sống trên, thì bạn đã nhầm.

Đây là giải pháp viết theo kiểu số Ả rập cho chúng ta dễ phát âm thôi, máy tính không "đọc" những ký tự như thể như bọn họ nên nó cũng không tàng trữ giống cách bọn họ viết những ký từ bỏ này ra đâu. Vấn đề ghi dữ liệu như vậy nào chính là lúc little endian với big endian được sử dụng đến.

Little endian với big endian là gì?

Little endian với big endian là nhì phương thức khác biệt để tàng trữ dữ liệu. Sự biệt lập của little endian cùng big endian khi giữ trữ chính là ở việc sắp xếp thứ tự những byte dữ liệu.

Trong cơ chế tàng trữ little endian (xuất vạc từ "little-end" nghĩa kết thúc bé dại hơn), byte sau cuối trong trình diễn nhị phân trên sẽ được ghi trước. Ví dụ như 123456789 ghi theo kiểu little endian sẽ thành

15 cd 5b 07Hơi ngược một chút ít đúng không? Big endian (xuất phạt từ "big-end") thì ngược lại, là nguyên tắc ghi tài liệu theo sản phẩm tự thông thường mà họ vẫn dùng. 123456789 được lưu trữ vẫn theo đúng thứ trường đoản cú là

07 5b cd 15Các thuật ngữ big-end hay little-end xuất phát từ cuốn tiểu thuyết Gulliver du ký (Gulliver"s Travels), trong số ấy nhân thiết bị Lilliputans tranh cãi về việc nên đập trứng bằng đầu to tuyệt nhỏ.

Và ngành IT đã áp dụng thuật ngữ ngày, kha khá giống với nghĩa gốc. Lưu ý rằng, little endian tốt big endian chỉ không giống nhau ở giải pháp sắp xếp các byte dữ liệu, còn vật dụng tự từng bit trong byte thì giống như nhau. Khôn cùng may, các máy vi tính vẫn có điểm trung này.

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

Little endian với big endian được dùng trên những máy tính nào?

Việc sắp tới xếp những byte dữ liệu theo hình dạng little endian tốt big endian không những xảy ra khi chúng ta lưu trữ dữ liệu ra bộ lưu trữ ngoài. Mọi hoạt động của máy tính số đông sử dụng tài liệu nhị phân, buộc phải little endian/big endian hiện hữu trong mọi hoạt động vui chơi 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 thiết kế viên cầm cố ý sử dụng một trong các hai loại, hoặc ngôn từ lập trình luật pháp trước), nó còn phụ thuộc vào vào bộ vi xử trí của chính máy tính đó.

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

Các bộ vi giải pháp xử lý PowerPC cùng SPARK trước đó đều là big endian, nhưng bây giờ chúng cũng rất được nâng cung cấp thành bi-endian.

Các có tác dụng nào thì giỏi hơn: little endian tuyệt big endian?

Little endian tuyệt big endian cũng như tranh luận gốc về câu hỏi đập trứng, không tồn tại một cách thức nào thực sự xuất sắc hơn cách tiến hành nào.

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

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

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

Nhưng giả dụ cũng trường phù hợp đó, mà thực hiện big endian, thì họ sẽ yêu cầu dịch add bộ nhớ bây giờ thêm 4 byte nữa mới có không khí để lưu giữ trữ.

Nhưng big endian cũng có thể có nhưng ưu thế nhất định, với việc đọc tài liệu byte lớn nhất trước, nó đã rất dễ dãi kiểm tra một số trong những là âm hay dương, vày byte cất dấu được phát âm đầu tiên.

Xem những byte dữ liệu trong cỗ nhớ

#include /* function to lớn show bytes in memory, from location start to 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 call above function for 0x01234567 */intmain () int i = 0x01234567; show_mem_rep ((char *) &i, sizeof (i)); return 0;Khi thực hiện chương trình trên, giả dụ máy của khách hàng là little endian thì tác dụng sẽ là

67 45 23 01còn trường hợp máy chúng ta là big endian thì nó đang hiển thị theo thiết bị tự thông thường

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

Nếu máy tính của bọn họ là little endian thì byte thứ nhất này đang là 1, ngược lại thì nó đang là 0.

Xem thêm: Tuyệt Chiêu Nhuộm Tóc Tự Nhiên Bằng Củ Dền Lên Màu Đỏ Đẹp Tự Nhiên Tại Nhà

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

Về cơ bạn dạng thì little endian hay big endian không có ảnh hưởng lắm đến sự việc lập trình. đa phần các xây dựng viên ko cần thân thiện nhiều lắm, do mọi vấ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 tâm, đặc biệt quan trọng khi biến hóa dữ liệu giữa các máy vi tính khác nhau. Ví dụ: khi bọn họ cần cách xử trí một file có cấu tạo thế này, 4 byte trước tiên là một số trong những nguyên n, sau đó là n số nguyên, từng số chiếm 4 byte cỗ nhớ, v.v...

Trong trường hợp này, khi thừa nhận file được tạo nên từ một máy tính khác, câu hỏi nó được ghi theo kiểu little endian xuất xắc big endian cụ thể là ảnh hưởng rất nghiêm trọng, nếu thực hiện sai phương thức, chúng ta sẽ thu về dữ liệu sai.

Một trường hòa hợp khác nữa hoàn toàn có thể xảy ra vụ việc là khi bọn họ ép kiểu cho những 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, bọn họ đã ép phong cách một array hai thành 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ó tác động rất lớn.

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

Vấn đề NUXI

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

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

#include intmain () short int *s; // pointer to 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 lớn next location *s = "IX"; // store second short: I * 256 + X return 0;Đoạn code trên hoàn toàn độc lập với hệ thống, bất kỳ nó là little hay big endian. Nếu chúng ta lưu trữ các giá trị "UN" và "IX" khi hiểu ra, nó vẫn đã là "UNIX" xuất xắc không? giả dụ mọi câu hỏi chỉ xảy ra trên một lắp thêm tính, mặc dù cho là big endian tốt little endian thì nó sẽ luôn là như vậy, vày mọi thứ sẽ được tự động hóa hoá giúp bọn chúng ta.

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

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

U N I XCòn một khối hệ thống little endian thì đang như sau:

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

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

Trao đổi dữ liệu giữa các máy có endian không giống nhau

Ngày nay, mọi máy vi tính đều được kết nối để trao đổi tài liệu với nhau. Little endian tốt big endian cũng hồ hết phải hiệp thương với nhau, cơ mà làm vậy nào để sở hữu hiểu được nhau khi bọn chúng không nói thông thường một thứ tiếng?

Có 2 giải pháp chính cho việc này

Sử dụng phổ biến định dạng

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

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

Thế tuy vậy trong liên kết với Internet, câu hỏi truyền tài liệu còn tinh vi hơn thế. Chúng ta không thể cứ cần sử dụng một định hình file như thế nào đó, rồi truyền từng byte một sang trang bị khác được. Mong muốn tăng tốc độ, bắt buộc bọn họ phải truyền nhiều byte một lúc.

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

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

Dù hệ thống big endian ko cần biến hóa dữ liệu, việc gọi hàm này vẫn là rất đề nghị thiết. Chương trình của chúng ta cũng có thể được viết bởi một ngôn từ (C) nhưng hoàn toàn có thể được dịch và tiến hành ở nhiều khối hệ thống khác nhau, việc gọi hàm này sẽ giúp họ làm điều đó.

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

htons - "Host khổng lồ Network Short"htonl- "Host to Network Long"ntohs - "Network khổng lồ 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 vẫn dữ liệu trên tầng thấp, ví dụ như khi soát sổ checksum của những gói tin chẳng hạn. Ví như không nắm rõ về little endian cùng big endian thì khi cần thao tác về mạng, bạn sẽ gặp các khó khăn.

Sử dụng BOM (Byte Order Mark)

Một giải pháp khác để giải quyết và xử lý sự biệt lập về endian là thực hiện BOM (Byte Order Mark). Đây là 1 trong ký tự quánh biệt, có giá trị là 0xFEFF, được ghi sinh hoạt vị trí đầu tiên của file.

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

Xem thêm: Bản Vẽ Tranh Chúc Mừng Sinh Nhật Bố, Top 6 Vẽ Tranh Tặng Sinh Nhật Bố

Thứ hai, BOM không hoàn toàn thần thánh, bởi nó phụ nằm trong vào lập trình sẵn viên. Có người có tâm thì hiểu và cách xử lý 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 áp dụng BOM khi lưu trữ dữ liệu nhiều byte (nhiều ký kết tự Unicode được mã hoá thành 2, 3 thậm chí là là 4 byte).