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 với big endian, đó là hai phương thức khác biệt để lưu trữ dữ liệu dạng nhị phân (binary). Bình thường thì bọn họ cũng chẳng cần suy nghĩ chúng làm cho gì. Bởi vì mọi việc sẽ được auto hoá hết.Bạn đã xem: Endian là gì
Thế nhưng có những tình huống, ví dụ khi đề nghị xử lý những tập tin tất cả cấu trúc, tập tin binary, tuyệt nhất là phần đông tập tin được ghi bằng ngữ điệu khác, thì bài toán hiểu về little endian và big endian là hết sức quan trọng. Bởi nếu không, rất bao gồm thể bọn họ sẽ hiểu sai lắp thêm tự và xử trí với tài liệu được đọc sai.Bạn sẽ xem: Endian là gì
Dữ liệuDữ liệu là miêu tả của thông tin dưới dạng lưu trữ được. Thông tin là máy trừu tượng, không tồn tại hình dạng, kia là phần đông hiểu biết về những sự vật, vấn đề xung quanh chúng ta. Để giữ trữ, cũng như truyền đạt tin tức đến phần lớn người, họ cần cho dữ liệu. Dữ liệu hoàn toàn có thể là chữ viết, hình ảnh được ghi trên giấy, vớ cả bọn họ dữ liệu mà nhỏ người có thể hiểu được.Bạn đã xem: Little endian là gì
Nhưng những tài liệu đó rất cần được được mã hoá một lần nữa, nếu bọn họ muốn tàng trữ chúng trên vật dụng tính. Như họ đều biết, máy tính chỉ thao tác với dữ liệu được mã hoá dưới dạng nhị phân, vậy phải 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 laptop được.
Bạn đang xem: Little endian là gì
Thực ra điều đó chỉ đúng với máy tính số (digital electronic computer). Nghe nói hiện thời máy tính lượng tử, máy vi tính sinh học cũng đang được phát triển, mong muốn trong vài ba năm tới, họ sẽ update lại kỹ năng và kiến thức về dữ liệu.
Thực ra, máy tính không hiểu được các ký trường đoản cú 0, một trong những hệ nhị phân đâu, nó chuyển động theo những tín hiệu năng lượng điện tử. Tế bào tả đúng mực thì vô cùng khó, nhưng bạn có thể hiểu "sơ sơ" rằng, gặp mặt bit 1 thì sẽ có dòng diện, gặp gỡ bit 0 thì ko có. Như vậy, các bit 0, 1 được xử trí thành các tín hiệu điện tử tương ứng, và chúng ta coi đó như laptop đã phát âm đượ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ác nhau cũng không thực thụ nói chung một ngôn ngữ. Cũng tương tự coi bạn vậy, khi nhìn những ký từ a, b, c có fan hiểu, có người không. Laptop khi nhìn vào các tín hiệu tương xứng với những ký hiệu 0 tốt 1, mỗi trang bị tính rất có thể hiểu theo một bí quyết khác nhau.
Thế nhưng, vô cùng may là các máy vi tính vẫn vận động theo phần nhiều tiêu chuẩn chung, thế nên nó vẫn rất có thể giao tiếp với nhau được. Mặc dù nhiên, lưu ý 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 trang bị tính, các dữ liệu nhị phân ko được giải pháp xử lý theo từng bit riêng lẻ, mà được cách xử lý thành từng khối 8 bit một, và đơn vị chức năng xử lý nhỏ nhất này điện thoại tư vấn là byte.
Ví dụ, số nguyên 123456789 được màn biểu diễn dưới dạng nhị phân đã là (ở đây tôi nhận định rằng kiểu dữ 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 kích cỡ 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ờ, các 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. Bạn cho rằng, nó sẽ tiến hành ghi theo lần lượt theo sản phẩm công nghệ tự mà họ đ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 họ dễ gọi thôi, máy tính xách tay không "đọc" các ký tự như là như bọn họ nên nó cũng không tàng trữ giống cách họ viết những ký trường đoản cú này ra đâu. Việc ghi dữ liệu như vậy nào chính là lúc little endian với 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 biệt để lưu trữ dữ liệu. Sự khác hoàn toàn 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 nhỏ tuổi hơn), byte sau cùng trong màn trình diễn nhị phân trên sẽ tiến hành ghi trước. Lấy một ví dụ 123456789 ghi theo kiểu little endian đã 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à hiệ tượng ghi dữ liệu theo sản phẩm tự thông thường mà chúng ta 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 xuất xắc little-end bắt đầu từ cuốn tè thuyết Gulliver du cam kết (Gulliver"s Travels), trong số đó nhân đồ gia dụng Lilliputans tranh biện về việc nên đập trứng bằng đầu to hay nhỏ.
Và ngành IT đã áp dụng thuật ngữ ngày, kha khá giống cùng với nghĩa gốc. Lưu ý rằng, little endian xuất xắc big endian chỉ không giống nhau ở cách sắp xếp các byte dữ liệu, còn trang bị tự từng bit vào byte thì như là nhau. Cực kỳ may, các máy tính xách tay vẫn bao gồm điểm trung này.
Thêm một lưu ý nữa rằng, little endian xuất xắc big endian chỉ khác hoàn toàn khi cần lưu trữ những dữ liệu có rất nhiều byte. Những tài liệu chỉ có 1 byte (ví dụ ký tự ASCII) thì không tác động gì (chính xác là mặc dù dùng cách làm nào công dụng cũng như nhau)
Little endian cùng big endian được dùng trên những máy tính nào?Việc sắp đến xếp các byte dữ liệu theo hình dạng little endian tốt big endian không chỉ có xảy ra khi chúng ta lưu trữ tài liệu ra bộ nhớ lưu trữ ngoài. Mọi buổi giao lưu của máy tính phần đô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 của máy tính.
Ngoài việc áp dụng little endian/big endian một trong những phần phụ nằm trong vào phần mềm (do lập trình sẵn viên nuốm ý sử dụng một trong các hai loại, hoặc ngữ điệu lập trình khí cụ trước), nó còn phụ thuộc vào bộ vi giải pháp xử lý của chính máy tính xách tay đó.
Các cỗ vi xử trí Intel đều thực hiện little endian, các bộ vi cách xử lý cả ARM trước đó cũng là little endian, cơ mà hiện này ARM đã upgrade vi xử lý của mình thành bi-endian (tức là xử lý cả little endian với big endian).
Các cỗ vi cách xử trí PowerPC và SPARK trước đó đều là big endian, nhưng bây chừ 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ì xuất sắc hơn: little endian giỏi big endian?Little endian tuyệt big endian tương tự như tranh luận gốc về bài toán đập trứng, không có một cách làm nào thực sự xuất sắc hơn phương thức nào.
Little endian hay big endian chỉ khác nhau ở việc tàng trữ thứ tự những byte dữ liệu. Cả nhị phương thức hồ hết không làm tác động đến tốc độ xử lý của CPU. Thế nên cả nhị phương thức phần đa vẫn tồn tại tuy nhiên song cùng sẽ không khi nào có thể gồm một câu trả lời thoả đáng: cách làm nào thì xuất sắc hơn?
Mỗi phương thức đều phải có những lợi thế nhất định. Với little endian, bởi vì byte nhỏ tuổi nhất luôn luôn nằm mặt trái, nó sẽ mang lại phép chúng ta đọc tài liệu với độ lâu năm tuỳ ý. Nó đã rất phù hợp nếu họ cần nghiền kiểu, lấy một ví dụ từ int thành long int.
Với đưa định int là 4 byte, long int là 8 byte, nếu cần sử dụng little endian, khi nghiền kiểu, add bộ nhớ không nhất thiết phải thay đổi, chúng ta chỉ buộc phải ghi tiếp các byte to hơn mà thôi.
Nhưng nếu như cũng trường hòa hợp đó, mà áp dụng big endian, thì chúng ta sẽ nên dịch địa chỉ bộ nhớ lúc này thêm 4 byte nữa mới có không khí để lưu giữ trữ.
Xem những byte dữ liệu trong bộ nhớ#include /* function to lớn show bytes in memory, from location start khổng lồ 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 tiến hành chương trình trên, nếu như máy của người sử dụng là little endian thì kết quả sẽ là
67 45 23 01còn nếu như 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ó giải pháp nào để xác định máy tính của chúng ta là little endian tuyệt big endian tốt không? gồm vô số những cách không giống nhau, dưới đây là một trong những những biện pháp đó:
Nếu máy tính của chúng ta là little endian thì byte trước tiên này vẫn là 1, ngược lại thì nó đang là 0.
Điều này tác động thế nào đến việc lập trìnhVề cơ bạn dạng thì little endian giỏi big endian ko có ảnh hưởng lắm đến sự việc lập trình. Nhiều phần các xây dựng viên ko cần nhiệt tình nhiều lắm, vị mọi việc đã được các trình biên dịch/thông dich đảm nhận hết.
Tuy nhiên, một số trường hợp, bọn họ cần quan tâm, đặc biệt quan trọng khi thay đổi dữ liệu giữa các máy tính xách tay khác nhau. Ví dụ: khi bọn họ cần cách xử trí một tệp tin có cấu tạo thế này, 4 byte trước tiên là một trong những nguyên n, kế tiếp là n số nguyên, mỗi số chiếm 4 byte bộ nhớ, v.v...
Trong trường đúng theo này, khi dìm file được tạo nên từ một máy tính khác, bài toán nó được ghi theo phong cách little endian xuất xắc big endian rõ ràng là ảnh hưởng rất nghiêm trọng, nếu sử dụng sai phương thức, chúng ta sẽ thu về tài liệu sai.
Một trường phù hợp khác nữa hoàn toàn có thể xảy ra sự việc 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 vẻ bên ngoài một array hai bộ phận char thành một số nguyên 2 byte (short int). Trong lấy một ví dụ này, little endian hay big endian cũng có ảnh hưởng rất lớn.
Một máy tính xách tay dùng little endian vẫn có tác dụng là 1 trong những khi big endian vẫn cho hiệu quả là 256. Để tránh phần đông lỗi xứng đáng tiếc hoàn toàn có thể xảy ra, mọi code như trên rất cần được tránh.
Vấn đề NUXINUXI là 1 vấn đề rất khét tiếng liên quan đến little endian với big endian: UNIX được lưu trong một khối hệ thống big-endian sẽ được hiểu là NUXI vào một khối hệ thống little endian.
Giả sử bọn họ cần lưu trữ 4 byte (U, N, I, X) bởi hai số nguyên dạng short int: UN cùng IX.
#include intmain () short int *s; // pointer to lớn set shorts s = (short int *)malloc(sizeof(short int)); // point to 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 chủ quyền với hệ thống, bất kỳ nó là little xuất xắc big endian. Nếu bọn họ lưu trữ các giá trị "UN" và "IX" khi đọc ra, nó vẫn vẫn là "UNIX" tuyệt không? giả dụ mọi câu hỏi chỉ xẩy ra trên một vật dụng tính, mặc dù cho là big endian hay little endian thì nó sẽ luôn là như vậy, vì mọi thứ vẫn được auto hoá giúp bọn chúng ta.
Với bất kể dữ liệu nào cũng vậy, họ luôn thu được tài liệu đúng ví như đọc cùng ghi trong và một hệ thống. Cụ nhưng, hãy cẩn thận kỹ hơn về bài toán sắp xếp những 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ì đã 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 tuy vậy khi mang ra họ vẫn có tài liệu ban đầu. Mặc dù thế khi họ ghi dữ liệu này ra file, gửi sang một máy vi tính khác. Và mỗi laptop lại xử lý theo phong cách riêng của chính nó thì UNIX trên thiết bị big endian sẽ tiến hành hiểu là NUXI trên thiết bị little endian (và ngược lại).
Đây đó là vấn đều nguy nan nhất khi họ trao đỏi dữ liệu qua lại thân các laptop 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 nhauNgày nay, mọi laptop đều được liên kết để trao đổi dữ liệu với nhau. Little endian hay big endian cũng gần như phải bàn bạc với nhau, tuy thế làm vắt nào để có hiểu được nhau khi chúng không nói tầm thường một máy tiếng?
Có 2 chiến thuật chính cho bài toán này
Sử dụng chung định dạng
Một phương án dễ dàng và đơn giản nhất tất cả sử dụng bình thường một định dang khi truyền dữ liệu.
Ví dụ đa số tập tin dạng PNG đều cần phải sử dụng big endian. Tương tự với những tập tin có cấu trúc khác. Đó là lý do vì sao bọn họ nhiều khi rất cần được dùng mọi phần mềm chuyên được dùng để đọc cùng ghi những file này.
Thế tuy vậy trong kết nối với Internet, vấn đề truyền dữ liệu còn phức tạp hơn thế. Họ không thể cứ dùng một format file làm sao đó, rồi truyền từng byte một sang lắp thêm khác được. Mong muốn tăng tốc độ, bắt buộc họ phải truyền những byte một lúc.
Và lúc đó bọn họ cần có một chuẩn chỉnh chung. Hiện nay nay, chuẩn chung cho câu hỏi truyền dữ liệu trên mạng, call là network byte order chính là big endian. Vậy nhưng, dù đã chuẩn chung rồi, thỉnh thoảng vẫn đang còn những giao thức nghịch chội hơn, áp dụng little endian.
Để gồm thể đổi khác 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 ngữ C). Trong hệ thống big endian, hàm này sẽ không cần làm gì cả, còn little endian sẽ thực hiện chuyển đối những byte một chút.
Dù khối hệ thống big endian ko cần biến hóa dữ liệu, vấn đề gọi hàm này vẫn chính là rất đề nghị thiết. Công tác của chúng ta có thể được viết bằng một ngôn ngữ (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, bài toán gọi hàm này đang giúp bọn họ làm điều đó.
Tương tự, sinh hoạt chiều ngược lại, bọn họ cần hotline hàm ntoh* để thay đổi dữ liệu nhận thấy từ mạng về tài liệu máy tính có thể hiểu được. Xung quanh ra, bọn họ còn phải hiểu rõ kiểu tài liệu mà chúng ta cần biến hóa nữa, danh sách các hàm đổi khác như sau:
htons - "Host lớn Network Short"htonl- "Host to Network Long"ntohs - "Network to lớn Host Short"ntohl - "Network lớn Host Long"Những hàm này vô cùng quan trọng khi tiến hành chia sẽ dữ liệu ở tầng thấp, lấy một ví dụ khi đánh giá checksum của các gói tin chẳng hạn. Nếu không hiểu rõ về little endian với big endian thì lúc cần thao tác về mạng, bạn sẽ gặp nhiều khó khăn.
Xem thêm: Hỏi Đáp Về Vắc Xin Dpt Là Gì, Chia Sẻ Kiến Thức Cộng Đồng Về Vắc Xin Dpt
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ụ nằm trong vào lập trình sẵn viên. Có người dân có tâm thì gọi và xử lý khi gặp gỡ BOM, có tín đồ thì trọn vẹn bỏ quên nó và coi nói như tài liệu thông thường. Unicode sử dụng BOM khi lưu 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).