Bài viết gốc: https://manhhomienbienthuy.bitbucket.io/2018/Sep/20/little-endian-vs-big-endian.html (đã xin phxay tác giả

)
Little endian và big endian, đấy là hai phương thức khác biệt nhằm tàng trữ tài liệu dạng nhị phân (binary). Bình thường thì bọn họ cũng chẳng nên quyên tâm mang đến chúng làm cái gi. Bởi hầu như việc sẽ tiến hành auto hoá hết.Quý khách hàng sẽ xem: Endian là gì
Thế tuy thế có những tình huống, ví dụ Lúc bắt buộc xử lý những tập tin bao gồm kết cấu, tập tin binary, nhất là phần nhiều tập tin được ghi bằng ngôn ngữ khác, thì Việc phát âm về little endian và big endian là khôn xiết quan trọng. Bởi còn nếu như không, siêu hoàn toàn có thể họ đang gọi không nên thiết bị tự và cách xử lý cùng với tài liệu được gọi không đúng.
Bạn đang xem: Little endian là gì
Dữ liệuDữ liệu là miêu tả của lên tiếng bên dưới dạng tàng trữ được. tin tức là lắp thêm trừu tượng, không tồn tại mẫu mã, sẽ là các hiểu biết về các sự vật dụng, vấn đề bao bọc chúng ta. Để lưu trữ, cũng như truyền đạt lên tiếng mang lại gần như fan, bọn họ đề nghị đến tài liệu. Dữ liệu hoàn toàn có thể là chữ viết, hình ảnh được ghi trên giấy, toàn bộ chúng ta tài liệu nhưng mà con tín đồ rất có thể hiểu được.
Nhưng đầy đủ tài liệu đó cần phải được mã hoá một lần tiếp nữa, giả dụ chúng ta ao ước tàng trữ bọn chúng bên trên laptop. Nlỗi họ đầy đủ biết, máy vi tính chỉ thao tác với tài liệu được mã hoá bên dưới dạng nhị phân, vậy nên các dữ liệu rất cần được mã hoá thành nhị phân bắt đầu rất có thể cách xử trí bên trên laptop được.
Thực ra điều này chỉ đúng với laptop số (digital electronic computer). Nghe nói hiện nay máy tính xách tay lượng tử, máy tính sinc học cũng đang được cải cách và phát triển, hy vọng trong vài ba năm cho tới, họ đang update lại kỹ năng về tài liệu.
Thực ra, laptop thiếu hiểu biết nhiều được những cam kết trường đoản cú 0, một trong các hệ nhị phân đâu, nó vận động theo các biểu đạt năng lượng điện tử. Mô tả đúng chuẩn thì cực kỳ cạnh tranh, cơ mà chúng ta có thể đọc "sơ sơ" rằng, chạm chán bit 1 thì sẽ sở hữu được dòng diện, gặp mặt bit 0 thì không có. bởi vậy, các bit 0, 1 được cách xử lý thành các dấu hiệu điện tử khớp ứng, với họ coi đó như máy vi tính đang phát âm được tài liệu nhị phân.
Thế nhưng lại, tuy vậy thuộc sử dụng biểu đạt dạng nhị phân, những máy vi tính khác nhau cũng ko thực sự nói chung một ngôn từ. Cũng hệt như coi bạn vậy, khi nhìn những ký kết từ a, b, c có người phát âm, tất cả người ko. Máy tính lúc chú ý vào các biểu thị tương xứng với những cam kết hiệu 0 hay như là 1, mỗi máy vi tính rất có thể hiểu theo một giải pháp khác nhau.
Thế nhưng, khôn cùng may là những máy tính xách tay vẫn vận động theo mọi tiêu chuẩn chỉnh phổ biến, thế nên nó vẫn hoàn toàn có thể giao tiếp cùng nhau được. Tuy nhiên, lưu ý rằng, không hẳn bất kể lúc làm sao, những máy tính xách tay cũng có thể phát âm được cho nhau.
Trong máy tính xách tay, các dữ liệu nhị phân ko được cách xử lý theo từng bit trật, mà lại được cách xử lý thành từng kân hận 8 bit một, và đơn vị chức năng cách xử trí bé dại tốt nhất này hotline là byte.
lấy một ví dụ, số nguim 123456789 được biểu diễn dưới dạng nhị phân đang là (ở chỗ này tôi nhận định rằng thứ hạng dữ liệu int sẽ có được size là 4 byte, mặc dù, những hệ thống 64 bit đã nâng kích cỡ này lên 8 byte)
00000111 01011011 11001101 00010101Để nđính thêm gọn gàng, bạn có thể viết nó dưới dạng hexa nlỗi sau:
07 5b cd 15Đã gồm khi nào, các bạn trường đoản cú hỏi, Khi ghi tài liệu này trên đĩa cứng chẳng hạn, nó được ghi vắt làm sao chưa. Quý khách hàng nhận định rằng, nó sẽ được ghi theo thứ tự theo thiết bị trường đoản cú cơ mà bọn họ vẫn đọc cùng viết ngơi nghỉ trên, thì bạn đã nhầm.
Đây là giải pháp viết theo kiểu số Ả rập mang lại bọn họ dễ nắm bắt thôi, máy tính không "đọc" các ký tự y như họ vì thế nó cũng không lưu trữ như là bí quyết họ viết những cam kết trường đoản cú này ra đâu. Việc ghi tài liệu như thế nào chính là lúc little endian và big endian được sử dụng mang lại.
Little endian và big endian là gì?Little endian với big endian là nhì phương thức không giống nhau để lưu trữ dữ liệu. Sự khác biệt của little endian cùng big endian khi lưu trữ đó là nghỉ ngơi bài toán bố trí máy trường đoản cú các byte tài liệu.
Trong nguyên tắc lưu trữ little endian (xuất phát điểm từ "little-end" nghĩa hoàn thành nhỏ dại hơn), byte sau cuối vào màn biểu diễn nhị phân bên trên sẽ được ghi trước. Ví dụ 123456789 ghi theo phong cách little endian đang thành
15 cd 5b 07Hơi ngược một chút ít đúng không? Big endian (bắt nguồn từ "big-end") thì trở lại, là nguyên tắc ghi tài liệu theo sản phẩm từ bỏ bình thường cơ mà họ vẫn dùng. 123456789 được tàng trữ vẫn theo như đúng vật dụng từ là
07 5b cd 15Các thuật ngữ big-end tốt little-kết thúc khởi đầu từ cuốn tiểu tngày tiết Gulliver du ký (Gulliver"s Travels), trong những số đó nhân đồ vật Lilliputans tranh biện về câu hỏi nên đập trứng bởi đầu khổng lồ tốt nhỏ.
Và ngành IT vẫn vận dụng thuật ngữ ngày, kha khá như thể cùng với nghĩa nơi bắt đầu. Lưu ý rằng, little endian xuất xắc big endian chỉ khác nhau sinh sống bí quyết bố trí các byte tài liệu, còn lắp thêm từ bỏ từng bit trong byte thì kiểu như nhau. Rất may, những máy tính xách tay vẫn có điểm trung này.
Thêm một để ý nữa rằng, little endian xuất xắc big endian chỉ khác hoàn toàn Lúc yêu cầu tàng trữ phần đông dữ liệu có nhiều byte. Những tài liệu chỉ có một byte (ví dụ ký từ bỏ ASCII) thì không tác động gì (đúng là dù cần sử dụng cách thức nào tác dụng cũng giống như nhau)
Little endian cùng big endian được sử dụng bên trên phần đa máy tính nào?Việc thu xếp các byte tài liệu theo kiểu little endian tốt big endian không những xảy ra khi chúng ta lưu trữ tài liệu ra bộ nhớ lưu trữ không tính. Mọi buổi giao lưu của máy vi tính hầu như áp dụng dữ liệu nhị phân, nên little endian/big endian hiện hữu trong hầu như hoạt động của máy vi tính.
Ngoài vấn đề sử dụng little endian/big endian một trong những phần dựa vào vào ứng dụng (bởi vì xây dựng viên ráng ý áp dụng một trong nhị loại, hoặc ngôn từ thiết kế qui định trước), nó còn dựa vào vào cỗ vi xử lý của bao gồm máy vi tính kia.
Các bộ vi cách xử lý Hãng Intel phần nhiều thực hiện little endian, các cỗ vi xử lý cả ARM trước đó cũng là little endian, tuy vậy hiện nay này ARM đang upgrade vi xử trí của chính mình thành bi-endian (có nghĩa là xử lý cả little endian và big endian).
Các bộ vi cách xử lý PowerPC với SPARK trước đó đa số là big endian, tuy thế bây chừ bọn chúng cũng được upgrade thành bi-endian.
Các có tác dụng làm sao thì tốt hơn: little endian tuyệt big endian?Little endian tốt big endian cũng như bàn cãi gốc về câu hỏi đập trứng, không có một thủ tục làm sao thực sự giỏi rộng cách làm như thế nào.
Little endian giỏi big endian chỉ không giống nhau sinh sống vấn đề tàng trữ thiết bị từ các byte dữ liệu. Cả nhị cách thức gần như ko làm tác động đến tốc độ cách xử trí của CPU. Thế bắt buộc cả nhị thủ tục các vẫn mãi mãi tuy nhiên tuy nhiên và sẽ không còn khi nào rất có thể có một câu vấn đáp thoả đáng: Phương thơm thức làm sao thì tốt hơn?
Mỗi cách tiến hành đều phải có đầy đủ ưu thế nhất quyết. Với little endian, vị byte nhỏ dại tuyệt nhất luôn nằm bên trái, nó vẫn có thể chấp nhận được họ phát âm dữ liệu với độ lâu năm tuỳ ý. Nó sẽ khá tương thích nếu như chúng ta phải ép phong cách, ví dụ tự int thành long int.
Với giả định int là 4 byte, long int là 8 byte, ví như dùng little endian, Lúc nghiền phong cách, liên can bộ nhớ không cần thiết phải biến hóa, chúng ta chỉ việc ghi tiếp các byte lớn hơn cơ mà thôi.
Nhưng giả dụ cũng trường hợp đó, nhưng thực hiện big endian, thì chúng ta sẽ nên dịch thúc đẩy bộ nhớ hiện nay thêm 4 byte nữa bắt đầu tất cả không khí để lưu trữ.
Nhưng big endian cũng có tuy thế điểm mạnh nhất quyết, cùng với bài toán phát âm dữ liệu byte lớn nhất trước, nó sẽ tương đối dễ dàng khám nghiệm một số là âm xuất xắc dương, do byte chứa vệt được phát âm đầu tiên.
Xem những byte dữ liệu vào bộ nhớ#include /* function to lớn show bytes in memory, from location start to start+n */voidshow_mem_rep (char *start, int n) int i; for (i = 0; i n; i++) printf (" %.2x", start); printf ("");/* Main function khổng lồ gọi above sầu function for 0x01234567 */intmain () int i = 0x01234567; show_mem_rep ((char *) &i, sizeof (i)); return 0;lúc xúc tiến công tác bên trên, ví như vật dụng của doanh nghiệp là little endian thì tác dụng đang là
67 45 23 01còn nếu như sản phẩm công nghệ chúng ta là big endian thì nó đã hiển thị theo lắp thêm từ thông thường
01 23 45 67Có bí quyết nào để xác định máy tính của họ là little endian tuyệt big endian xuất xắc không? Có rất nhiều các cách khác biệt, bên dưới đây là một trong các những cách đó:
#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 dễ dàng và đơn giản trên, c là bé trỏ, nó trỏ đến vùng nhớ của thay đổi i là một số nguyên. Bởi do số ngulặng là giao diện tài liệu những byte, vào khí dữ liệu của char chỉ là 1 trong những byte nhưng thôi, phải *c đã trả về quý giá là byte đầu tiên của số nguim i.
Xem thêm: Autocad 2007 Bị Lỗi Fatal Error, Fatal Error Trong Cad Giải Quyết Ra Sao
Nếu máy tính của chúng ta là little endian thì byte thứ nhất này đã là 1 trong những, ngược lại thì nó đang là 0.
Vấn đề này ảnh hưởng gắng như thế nào đến việc lập trìnhVề cơ bạn dạng thì little endian tốt big endian không tồn tại ảnh hưởng lắm tới sự việc thiết kế. Phần phệ những lập trình viên ko đề nghị quyên tâm nhiều lắm, bởi hầu như bài toán đã làm được những trình biên dịch/thông dich phụ trách không còn.
Tuy nhiên, một số ngôi trường đúng theo, họ yêu cầu quan tâm, đặc biệt quan trọng Lúc thay đổi dữ liệu giữa những máy tính khác biệt. Ví dụ: Khi chúng ta buộc phải cách xử trí một file có cấu tạo nuốm này, 4 byte đầu tiên là một vài nguim n, sau đó là n số nguim, mỗi số chiếm phần 4 byte bộ lưu trữ, v.v...
Trong ngôi trường hợp này, Lúc dìm file được tạo thành xuất phát từ một máy vi tính khác, bài toán nó được ghi theo phong cách little endian xuất xắc big endian ví dụ là ảnh hưởng vô cùng rất lớn, nếu như sử dụng không nên cách thức, bọn họ đang thu về tài liệu không nên.
Một ngôi trường hợp khác nữa có thể xẩy ra sự việc là lúc chúng ta ép dạng hình 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 vẫn nghiền hình dạng một array nhị bộ phận char thành một vài ngulặng 2 byte (short int). Trong ví dụ này, little endian hay big endian cũng có tác động không hề nhỏ.
Một máy vi tính sử dụng little endian sẽ sở hữu được tác dụng là một trong những lúc big endian đang đến tác dụng là 256. Để rời phần đông lỗi không mong muốn có thể xẩy ra, hồ hết code nlỗi trên rất cần được rời.
Vấn đề NUXINUXI là 1 vấn đề cực kỳ nổi tiếng liên quan đến little endian cùng big endian: UNIX được lưu vào một hệ thống big-endian sẽ được đọc là NUXI vào một hệ thống little endian.
Giả sử bọn họ cần lưu trữ 4 byte (U, N, I, X) bởi nhì số ngulặng 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 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ọn vẹn chủ quyền với khối hệ thống, bất cứ nó là little hay big endian. Nếu chúng ta lưu trữ những cực hiếm "UN" và "IX" Khi gọi ra, nó vẫn vẫn là "UNIX" tốt không? Nếu phần đông việc chỉ xảy ra trên một laptop, mặc dù là big endian tuyệt little endian thì nó đã luôn là điều đó, bởi hầu như thiết bị sẽ được tự động hóa hoá giúp chúng ta.
Với bất kể dữ liệu nào thì cũng vậy, chúng ta luôn luôn thu được dữ liệu đúng ví như hiểu cùng ghi vào và một khối hệ thống. Thế nhưng mà, hãy để mắt tới kỹ hơn về bài toán thu xếp những byte vào bộ nhớ lưu trữ.
Một hệ thống big endian đã tàng trữ như sau:
U N I XCòn một hệ thống little endian thì đang nhỏng sau:
N U X IMặc mặc dù trông tương đối ngược dẫu vậy khối hệ thống little endian đã xử lý câu hỏi đọc góp bọn họ, yêu cầu lưu trữ như thế nhưng khi kéo ra chúng ta vẫn có dữ liệu ban đầu. Thế nhưng mà Khi bọn họ ghi tài liệu này ra file, chuyển qua 1 máy vi tính không giống. Và từng máy vi tính lại cách xử lý Theo phong cách riêng của nó thì UNIX bên trên lắp thêm big endian sẽ tiến hành gọi là NUXI bên trên trang bị little endian (và ngược lại).
Đây chính là vấn hầu hết nguy hiểm nhất lúc họ trao đỏi tài liệu hỗ tương giữa những máy tính xách tay với nhau, đặc biệt trong thời đại Intethời nay.
Trao đổi tài liệu giữa những sản phẩm công nghệ bao gồm endian khác nhauNgày ni, đông đảo laptop hầu như được liên kết để hội đàm tài liệu cùng nhau. Little endian tuyệt big endian cũng phần nhiều nên điều đình cùng nhau, tuy nhiên làm cho rứa như thế nào để sở hữu gọi được nhau Khi chúng ko nói thông thường một trang bị tiếng?
Có 2 phương án chủ yếu mang đến bài toán này
Sử dụng chung định dạng
Một cách thực hiện dễ dàng và đơn giản độc nhất vô nhị tất cả sử dụng phổ biến một định dang Lúc truyền dữ liệu.
lấy một ví dụ các tập tin dạng PNG gần như bắt buộc phải sử dụng big endian. Tương từ bỏ cùng với các tập tin gồm cấu tạo không giống. Đó là nguyên nhân vì chưng sao họ thỉnh thoảng cần được dùng đa số ứng dụng chuyên được sự dụng để đọc cùng ghi những tệp tin này.
Thế nhưng lại trong liên kết cùng với Internet, vấn đề truyền tài liệu còn phức tạp chưa dừng lại ở đó. Chúng ta quan yếu cứ sử dụng một định hình tệp tin như thế nào kia, rồi truyền từng byte một sang đồ vật khác được. Muốn nắn tăng vận tốc, đề nghị chúng ta nên truyền những byte một thời gian.
Và khi ấy họ cần có một chuẩn bình thường. Lúc này, chuẩn bình thường cho bài toán truyền tài liệu trên mạng, Gọi là network byte order đó là big endian. Thế mà lại, dù đã chuẩn chỉnh bình thường rồi, thỉnh phảng phất vẫn có những giao thức đùa chội hơn, thực hiện little endian.
Để có thể thay đổi dữ liệu thành dữ liệu chuẩn chỉnh theo network byte order, lịch trình nên Hotline hàm hton* (host-to-network) (vào ngữ điệu C). Trong hệ thống big endian, hàm này không yêu cầu làm cái gi cả, còn little endian đã tiến hành gửi đối các byte một chút.
Dù hệ thống big endian không bắt buộc chuyển đổi tài liệu, việc Điện thoại tư vấn hàm này vẫn chính là hết sức quan trọng. Cmùi hương trình của chúng ta có thể được viết bằng một ngữ điệu (C) mà lại rất có thể được dịch và tiến hành sinh sống các hệ thống không giống nhau, việc Gọi hàm này để giúp họ làm điều đó.
Tương từ, sống chiều ngược trở lại, họ cần Call hàm ntoh* nhằm thay đổi dữ liệu nhận ra từ mạng về dữ liệu máy vi tính rất có thể phát âm được. Dường như, họ còn bắt buộc hiểu rõ hình dáng tài liệu nhưng mà họ nên biến hóa nữa, list những hàm biến đổi nlỗi sau:
htons - "Host to lớn Network Short"htonl- "Host to Network Long"ntohs - "Network to Host Short"ntohl - "Network khổng lồ Host Long"Những hàm này hết sức đặc trưng khi tiến hành phân tách đã tài liệu trên tầng phải chăng, ví dụ Khi kiểm soát checksum của những gói tin chẳng hạn. Nếu ko nắm rõ về little endian với big endian thì Khi nên thao tác làm việc về mạng, bạn sẽ chạm mặt những khó khăn.
Sử dụng BOM (Byte Order Mark)
Một cách thực hiện không giống nhằm xử lý sự biệt lập về endian là thực hiện BOM (Byte Order Mark). Đây là 1 ký tự quan trọng đặc biệt, có giá trị là 0xFEFF, được ghi ở vị trí trước tiên của file.
Nếu bạn đọc cam kết từ này là 0xFFFE (bị ngược) thì có nghĩa tệp tin này được ghi cùng với endian khác với hệ thống của người tiêu dùng, khi đó, bạn sẽ rất cần được biến đổi phương thức hiểu tài liệu một chút ít.
Thđọng hai, BOM ko hoàn toàn thần thánh, bởi vì nó phụ thuộc vào vào xây dựng viên. Có người có vai trung phong thì hiểu với cách xử lý lúc gặp BOM, tất cả người thì trọn vẹn bỏ quên nó cùng coi nói nhỏng tài liệu thông thường. Unicode sử dụng BOM Lúc lưu trữ dữ liệu nhiều byte (các ký từ Unicode được mã hoá thành 2, 3 thậm chí còn là 4 byte).