BIG 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 tác giả

)
Little endian cùng big endian, đấy là hai phương thức khác nhau để tàng trữ dữ liệu dạng nhị phân (binary). Bình thường thì họ cũng chẳng cần suy xét chúng làm cho gì. Vì chưng mọi việc sẽ được auto hoá hết.Bạn sẽ xem: Endian là gì
Thế nhưng gồm có tình huống, lấy ví dụ như khi đề xuất xử lý những tập tin tất cả cấu trúc, tập tin binary, tốt nhất là phần đa tập tin được ghi bằng ngôn từ khác, thì việc hiểu về little endian và big endian là vô cùng quan trọng. Vì chưng nếu không, rất gồm thể bọn họ sẽ hiểu sai lắp thêm tự và giải pháp xử lý với dữ liệu được gọi sai.Bạn vẫn xem: Endian là gì
Dữ liệuDữ liệu là bộc lộ của thông tin dưới dạng lưu trữ được. Thông tin là thứ trừu tượng, không có hình dạng, kia là những 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 giống như truyền đạt thông tin đến phần đa người, chúng ta cần đến dữ liệu. Dữ liệu hoàn toàn có thể là chữ viết, hình hình ảnh được ghi bên trên giấy, vớ cả chúng ta dữ liệu mà con người hoàn toàn có thể hiểu được.Bạn đang xem: Little endian là gì
Nhưng những tài liệu đó cần được được mã hoá một lượt nữa, nếu chúng ta muốn lưu trữ chúng trên đồ vật tính. Như họ đều biết, máy tính xách tay chỉ làm việc với dữ liệu được mã hoá bên dưới dạng nhị phân, vậy yêu cầu mọi dữ liệu cần được mã hoá thành nhị phân mới hoàn toàn có thể xử lý trên máy tính được.Bạn sẽ xem: Little endian là gì
Thực ra điều đó chỉ đúng với máy tính xách tay số (digital electronic computer). Nghe nói hiện nay máy tính lượng tử, máy tính sinh học tập cũng đang được phát triển, hy vọng trong vài năm tới, bọn họ sẽ update lại kiến thức về dữ liệu.
Bạn đang xem: Big endian là gì
Thực ra, sản phẩm tính không hiểu biết được các ký từ bỏ 0, một trong hệ nhị phân đâu, nó hoạt động theo những 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 chúng ta cũng có thể hiểu "sơ sơ" rằng, gặp 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, các bit 0, 1 được cách xử trí thành các tín hiệu năng lượng điện tử tương ứng, và chúng ta coi đó như máy vi tính đã đọc được tài liệu nhị phân.
Thế nhưng, tuy vậy cùng sử dụng tín hiệu dạng nhị phân, những máy tính khác nhau cũng không thực thụ nói bình thường một ngôn ngữ. Cũng như coi người vậy, khi nhìn những ký trường đoản cú a, b, c có bạn hiểu, có bạn không. Laptop khi chú ý vào những tín hiệu tương ứng với các ký hiệu 0 hay 1, mỗi thứ tính rất có thể hiểu theo một giải pháp khác nhau.
Thế nhưng, cực kỳ may là các laptop vẫn hoạt động theo hồ hết tiêu chuẩn chung, vậy nên nó vẫn rất có thể giao tiếp với nhau được. Tuy nhiên, xem xét rằng, không phải bất cứ 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 máy tính, những dữ liệu nhị phân ko được xử trí theo từng bit riêng rẽ lẻ, nhưng được cách xử lý thành từng khối 8 bit một, và đơn vị xử lý nhỏ nhất này gọi là byte.
Ví dụ, số nguyên 123456789 được màn biểu diễn dưới dạng nhị phân vẫn là (ở đây tôi nhận định rằng kiểu dữ liệu int đã có form size là 4 byte, mặc dù nhiên, nhiều hệ thống 64 bit đang nâng kích cỡ này lên 8 byte)
00000111 01011011 11001101 00010101Để ngắn gọn, chúng ta cũng có thể viết nó dưới dạng hexa như sau:
07 5b cd 15Đã tất cả bao giờ, bạn tự hỏi, lúc ghi tài liệu này trên đĩa cứng chẳng hạn, nó được ghi cố nào chưa. Chúng ta cho rằng, nó sẽ được ghi lần lượt theo thứ tự mà bọn họ đang đọc với viết ngơi nghỉ trên, thì bạn đã nhầm.
Đây là giải pháp viết theo phong cách số Ả rập cho chúng ta dễ gọi thôi, laptop không "đọc" các ký tự tương tự như bọn họ nên nó cũng không lưu trữ giống cách bọn họ viết các ký trường đoản cú này ra đâu. Câu hỏi ghi dữ liệu như vậy nào chính là lúc little endian cùng big endian được dùng đến.
Little endian và big endian là gì?Little endian với big endian là nhì phương thức khác nhau để tàng trữ dữ liệu. Sự biệt lập của little endian với big endian khi lưu lại trữ chính là ở việc bố trí 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ỏ hơn), byte cuối cùng trong trình diễn nhị phân trên sẽ tiến hành ghi trước. Ví dụ như 123456789 ghi theo phong cách little endian sẽ thành
15 cd 5b 07Hơi ngược một chút đúng không? Big endian (xuất phạt từ "big-end") thì ngược lại, là chế độ ghi tài liệu theo máy tự thông thường mà chúng ta vẫn dùng. 123456789 được tàng trữ vẫn theo như đúng thứ trường đoản cú 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 ký kết (Gulliver"s Travels), trong những số ấy nhân vật Lilliputans bàn cãi về vấn đề nên đập trứng bởi đầu to tốt nhỏ.
Và ngành IT đã vận dụng thuật ngữ ngày, tương đối giống với nghĩa gốc. Xem xét rằng, little endian tuyệt big endian chỉ khác nhau ở bí quyết sắp xếp những byte dữ liệu, còn vật dụng tự từng bit trong byte thì kiểu như nhau. Hết sức may, các máy tính xách tay vẫn gồm điểm trung này.
Thêm một để ý nữa rằng, little endian hay 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ó 1 byte (ví dụ cam kết tự ASCII) thì không tác động gì (chính xác là cho dù dùng cách làm nào công 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 xếp các byte dữ liệu theo hình dáng little endian xuất xắc big endian không những xảy ra khi họ lưu trữ tài liệu ra bộ nhớ lưu trữ ngoài. Mọi hoạt động vui chơi của máy tính rất nhiều sử dụng tài liệu nhị phân, cần little endian/big endian tồn tại trong mọi hoạt động vui chơi của máy tính.
Ngoài việc thực hiện little endian/big endian một trong những phần phụ ở trong vào ứng dụng (do thiết kế viên gắng ý sử dụng 1 trong những 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 vào bộ vi xử trí của chính máy tính xách tay đó.
Các cỗ vi cách xử trí Intel đều áp dụng little endian, những bộ vi cách xử trí cả ARM trước đó cũng là little endian, nhưng mà hiện này ARM đã nâng cấp vi xử lý của mình thành bi-endian (tức là cách xử lý cả little endian cùng big endian).
Các bộ vi cách xử lý PowerPC cùng SPARK trước đây đều là big endian, nhưng hiện thời chúng cũng khá được nâng cấp thành bi-endian.
Các có tác dụng nào thì giỏi hơn: little endian tốt big endian?Little endian xuất xắc big endian cũng như tranh luận cội về bài toán đập trứng, không có một cách làm nào thực sự tốt hơn cách tiến hành nào.
Little endian xuất xắc big endian chỉ không giống nhau ở việc tàng trữ thứ tự các byte dữ liệu. Cả nhì phương thức phần đông không làm tác động đến vận tốc xử lý của CPU. Vậy cho nên cả hai phương thức các vẫn tồn tại song song với sẽ không lúc nào có thể có một câu vấn đáp thoả đáng: cách thức nào thì tốt hơn?
Mỗi phương thức đều sở hữu những điểm mạnh nhất định. Cùng với little endian, vị byte bé dại nhất luôn nằm bên trái, nó sẽ cho phép họ đọc dữ liệu với độ lâu năm tuỳ ý. Nó sẽ rất tương thích nếu bọn họ cần xay kiểu, lấy một ví dụ từ int thành long int.
Với trả định int là 4 byte, long int là 8 byte, nếu dùng little endian, khi ép kiểu, showroom bộ nhớ không cần thiết phải thay đổi, họ chỉ phải ghi tiếp các byte to hơn mà thôi.
Nhưng trường hợp cũng trường vừa lòng đó, mà thực hiện big endian, thì chúng ta sẽ nên dịch địa chỉ cửa hàng bộ nhớ hiện tại thêm 4 byte nữa bắt đầu có không khí để giữ trữ.
Xem các byte dữ liệu trong cỗ nhớ#include /* function to 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 call 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 người tiêu dùng là little endian thì kết quả sẽ là
67 45 23 01còn nếu như máy bạn là big endian thì nó vẫn hiển thị theo đồ vật tự thông thường
01 23 45 67Có bí quyết nào để xác định máy tính của bọn họ là little endian tuyệt big endian giỏi không? có vô số những cách không giống nhau, dưới đó là một trong những những giải pháp đó:
Nếu laptop của họ là little endian thì byte thứ nhất này vẫn là 1, ngược lại thì nó đang là 0.
Xem thêm: Các Resort Gần Hà Nội Cực Lý Tưởng Để Lưu Trú Khi Du Lịch Miền Bắc
Về cơ bản thì little endian xuất xắc big endian không có tác động lắm tới việc lập trình. đa số các lập trình viên ko cần thân thương nhiều lắm, do mọi câu hỏi đã được các trình biên dịch/thông dich đảm nhận hết.
Tuy nhiên, một số trong những trường hợp, chúng ta cần quan lại tâm, đặc biệt quan trọng khi chuyển đổi dữ liệu thân các laptop khác nhau. Ví dụ: khi chúng ta cần xử trí một tệp tin có cấu trúc thế này, 4 byte thứ nhất là một số nguyên n, sau đó là n số nguyên, từng số chiếm 4 byte bộ nhớ, v.v...
Trong trường phù hợp này, khi nhận file được tạo thành từ một máy vi tính khác, bài toán nó được ghi theo kiểu little endian hay big endian rõ ràng là tác động rất nghiêm trọng, nếu sử dụng sai phương thức, họ sẽ thu về dữ liệu sai.
Một trường thích hợp khác nữa rất có thể xảy ra sự việc là khi bọn họ é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, họ đã ép kiểu một array hai bộ phận char thành một trong những nguyên 2 byte (short int). Trong lấy ví dụ này, little endian tuyệt big endian cũng có ảnh hưởng rất lớn.
Một máy vi tính dùng little endian vẫn có tác dụng là một trong những khi big endian đã cho công dụng là 256. Để tránh rất nhiều lỗi đáng tiếc rất có thể xảy ra, phần đông code như trên rất cần được tránh.
Vấn đề NUXINUXI là một vấn đề rất khét tiếng liên quan cho little endian và big endian: UNIX được lưu giữ 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ử bọn họ cần tàng 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 lớn set shorts s = (short int *)malloc(sizeof(short int)); // point to lớn location 0 *s = "UN"; // store first short: U * 256 + N (fictional code) s += 2; // point khổng lồ next location *s = "IX"; // store second short: I * 256 + X return 0;Đoạn code trên trả toàn hòa bình với hệ thống, bất kỳ nó là little tốt big endian. Nếu bọn họ lưu trữ những giá trị "UN" cùng "IX" khi hiểu ra, nó vẫn đã là "UNIX" xuất xắc không? nếu như mọi việc chỉ xảy ra trên một lắp thêm tính, mặc dù là big endian xuất xắc little endian thì nó sẽ luôn luôn là như vậy, vì chưng mọi thứ đã được auto hoá giúp bọn chúng ta.
Với bất kể dữ liệu nào cũng vậy, chúng ta luôn thu được dữ liệu đúng nếu như đọc và ghi trong và một hệ thống. Gắng nhưng, hãy xem xét 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ì vẫn như sau:
N U X IMặc dù trông tương đối ngược nhưng khối hệ thống little endian vẫn xử lý bài toán đọc giúp chúng ta, nên lưu trữ như vậy nhưng lại khi lấy ra chúng ta vẫn có tài liệu ban đầu. Tuy nhiên khi họ ghi dữ liệu này ra file, chuyển sang một máy tính xách tay khác. Và mỗi máy tính xách tay lại xử lý theo phong cách riêng của nó thì UNIX trên đồ vật big endian sẽ được hiểu là NUXI trên sản phẩm công nghệ little endian (và ngược lại).
Đây chính là vấn đều nguy hiểm nhất khi chúng ta trao đỏi tài liệu qua lại thân các máy tính với nhau, đặc biệt trong thời đại Intengày nay.
Trao đổi dữ liệu giữa những máy có endian khác nhauNgày nay, mọi laptop đều được kết nối để trao đổi dữ liệu với nhau. Little endian tốt big endian cũng phần đông phải trao đổi với nhau, dẫu vậy làm rứa nào để có hiểu được nhau khi bọn chúng không nói thông thường một sản phẩm tiếng?
Có 2 phương án chính cho bài toán này
Sử dụng phổ biến định dạng
Một phương án đơn giản và 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ụ các tập tin dạng PNG đều cần phải sử dụng big endian. Tương tự với các tập tin có cấu tạo khác. Đó là tại sao vì sao bọn họ nhiều khi rất cần được dùng hầu hết phần mềm chuyên được dùng để đọc với ghi những file này.
Thế nhưng trong liên kết với Internet, bài toán truyền dữ liệu còn phức tạp hơn thế. Họ không thể cứ cần sử dụng một format file như thế nào đó, rồi truyền từng byte một sang thứ khác được. Mong muốn tăng tốc độ, bắt buộc họ phải truyền các byte một lúc.
Và khi đó họ cần có một chuẩn chỉnh chung. Hiện tại nay, chuẩn chung cho việc truyền dữ liệu trên mạng, hotline là network byte order chính là big endian. Nỗ lực nhưng, 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, áp dụng little endian.
Để có thể chuyển đổi dữ liệu thành dữ liệu chuẩn chỉnh theo network byte order, chương trình đề xuất 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 ko cần chuyển đổi dữ liệu, bài toán gọi hàm này vẫn chính là rất đề nghị thiết. Công tác của bạn có thể được viết bởi một ngữ điệu (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 đang giúp họ làm điều đó.
Xem thêm: Top 23 Nhà Hàng Nam Long Hội An Hút Khách Nhất, Nhà Hàng Nam Long Hội An
Tương tự, sống chiều ngược lại, họ cần hotline hàm ntoh* để đổi khác dữ liệu cảm nhận từ mạng về tài liệu máy tính hoàn toàn có thể hiểu được. Không tính ra, bọn họ còn phải nắm rõ kiểu tài liệu mà chúng ta cần chuyển đổi nữa, danh sách những hàm chuyển đổi như sau:
htons - "Host khổng lồ Network Short"htonl- "Host to Network Long"ntohs - "Network lớn Host Short"ntohl - "Network lớn Host Long"Sử dụng BOM (Byte Order Mark)
Thứ hai, BOM không trọn vẹn thần thánh, bởi vì nó phụ ở trong vào lập trình viên. Có người dân có tâm thì hiểu và cách xử trí khi gặp BOM, có fan thì hoàn toàn bỏ quên nó với coi nói như dữ liệu thông thường. Unicode sử dụng BOM khi lưu trữ dữ liệu nhiều byte (nhiều ký tự Unicode được mã hoá thành 2, 3 thậm chí là 4 byte).