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ông giống nhau để tàng trữ tài liệu dạng nhị phân (binary). Bình hay thì bọn họ cũng chẳng bắt buộc quan tâm đến bọn chúng làm cái gi. Bởi hầu như vấn đề sẽ được tự động hóa hoá không còn.

Bạn đang xem: Little endian là gì

Thế nhưng bao hàm trường hợp, ví dụ lúc buộc phải giải pháp xử lý các tập tin bao gồm kết cấu, tập tin binary, độc nhất vô nhị là hồ hết tập tin được ghi bởi ngôn ngữ không giống, thì Việc phát âm về little endian cùng big endian là vô cùng quan trọng. Bởi nếu như không, khôn xiết hoàn toàn có thể bọn họ sẽ hiểu không đúng sản phẩm công nghệ từ cùng xử lý cùng với dữ liệu được gọi sai.

Dữ liệu

Dữ liệu là trình bày của thông tin bên dưới dạng tàng trữ được. Thông tin là thiết bị trừu tượng, không có kiểu dáng, chính là đều gọi biết về các sự đồ, vấn đề bao bọc họ. Để lưu trữ, tương tự như truyền đạt biết tin đến phần lớn tín đồ, họ đề xuất mang đến dữ liệu. Dữ liệu hoàn toàn có thể là chữ viết, hình hình ảnh được ghi trên chứng từ, tất cả họ dữ liệu nhưng mà nhỏ bạn rất có thể hiểu được.

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

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 vi tính lượng tử, máy tính xách tay sinch học cũng đang được cách tân và phát triển, mong muốn trong vài năm tới, chúng ta đang update lại kiến thức và kỹ năng về dữ liệu.

Thực ra, máy tính không hiểu nhiều được các cam kết trường đoản cú 0, một trong các hệ nhị phân đâu, nó hoạt động theo các biểu hiện điện tử. Mô tả đúng đắn thì khôn xiết khó khăn, dẫu vậy bạn có thể gọi "sơ sơ" rằng, gặp gỡ bit 1 thì sẽ sở hữu chiếc diện, gặp gỡ bit 0 thì không tồn tại. do vậy, những bit 0, 1 được xử trí thành những dấu hiệu điện tử tương ứng, cùng chúng ta coi đó như máy vi tính đang gọi được tài liệu nhị phân.

Thế tuy nhiên, mặc dù cùng thực hiện biểu lộ dạng nhị phân, các máy tính xách tay khác biệt cũng ko thực sự nói bình thường một ngữ điệu. Cũng y như coi tín đồ vậy, Khi quan sát những ký từ a, b, c gồm bạn gọi, gồm fan ko. Máy tính khi chú ý vào những tín hiệu khớp ứng với các cam kết hiệu 0 hay 1, từng máy tính có thể gọi theo một bí quyết không giống nhau.

Thế dẫu vậy, vô cùng may là các máy tính xách tay vẫn hoạt động theo những tiêu chuẩn tầm thường, thế cho nên nó vẫn hoàn toàn có thể giao tiếp với nhau được. Tuy nhiên, lưu ý rằng, không hẳn bất kể thời điểm như thế nào, các laptop cũng hoàn toàn có thể gọi được cho nhau.

Trong máy tính, những dữ liệu nhị phân ko được xử lý theo từng bit riêng lẻ, nhưng mà được xử trí thành từng khối hận 8 bit một, với đơn vị chức năng cách xử lý bé dại độc nhất này gọi là byte.

ví dụ như, số nguyên ổn 123456789 được màn biểu diễn dưới dạng nhị phân vẫn là (tại đây tôi nhận định rằng hình trạng dữ liệu int sẽ sở hữu được kích thước là 4 byte, tuy vậy, các khối hệ thống 64 bit đang nâng kích thước này lên 8 byte)

00000111 01011011 11001101 00010101Để nđính thêm gọn gàng, chúng ta cũng có thể viết nó bên dưới dạng hexa nhỏng sau:

07 5b cd 15Đã gồm lúc nào, bạn trường đoản cú hỏi, khi ghi dữ liệu này trên đĩa cứng chẳng hạn, nó được ghi vắt như thế nào không. quý khách cho rằng, nó sẽ được ghi theo thứ tự theo máy từ bỏ nhưng mà chúng ta đã gọi cùng viết sinh hoạt bên trên, thì các bạn đã nhầm.

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

Little endian cùng big endian là gì?

Little endian và big endian là nhị cách tiến hành khác biệt để lưu trữ tài liệu. Sự biệt lập của little endian cùng big endian khi tàng trữ đó là ở bài toán bố trí thứ trường đoản cú những byte tài liệu.

Trong cách thức lưu trữ little endian (khởi nguồn từ "little-end" nghĩa chấm dứt nhỏ dại hơn), byte cuối cùng trong biểu diễn nhị phâ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 (khởi đầu từ "big-end") thì ngược trở lại, là vẻ ngoài ghi tài liệu theo sản phẩm trường đoản cú thông thường nhưng mà họ vẫn cần sử dụng. 123456789 được lưu trữ vẫn theo như đúng sản phẩm công nghệ trường đoản cú là

07 5b cd 15Các thuật ngữ big-over hay little-kết thúc bắt đầu từ cuốn tiểu tngày tiết Gulliver du ký (Gulliver"s Travels), trong các số đó nhân đồ vật Lilliputans bàn cãi về câu hỏi phải đập trứng bằng đầu lớn xuất xắc nhỏ tuổi.

Và ngành IT đã ứng dụng thuật ngữ ngày, kha khá giống như với nghĩa nơi bắt đầu. Lưu ý rằng, little endian tuyệt big endian chỉ khác nhau làm việc cách bố trí những byte dữ liệu, còn lắp thêm từ từng bit vào byte thì như thể nhau. Rất may, các máy vi tính vẫn đang còn điểm trung này.

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

Little endian với big endian được dùng bên trên rất nhiều laptop nào?

Việc thu xếp các byte tài liệu theo kiểu little endian xuất xắc big endian không chỉ xẩy ra khi chúng ta lưu trữ dữ liệu ra bộ nhớ lưu trữ quanh đó. Mọi buổi giao lưu của máy tính xách tay mọi áp dụng tài liệu nhị phân, bắt buộc little endian/big endian hiện hữu trong đa số 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 phần phụ thuộc vào vào ứng dụng (vì chưng xây dựng viên cố ý thực hiện 1 trong các hai nhiều loại, hoặc ngôn ngữ lập trình chế độ trước), nó còn phụ thuộc vào vào cỗ vi cách xử lý của chính máy vi tính kia.

Các cỗ vi cách xử trí Intel hầu như áp dụng little endian, các bộ vi cách xử lý cả ARM trước đây cũng là little endian, nhưng mà hiện tại này ARM sẽ tăng cấp vi xử lý của bản thân thành bi-endian (Có nghĩa là cách xử trí cả little endian và big endian).

Các bộ vi cách xử lý PowerPC với SPARK trước đây đa số là big endian, cơ mà hiện nay chúng cũng khá được upgrade 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 hay big endian cũng như tranh biện cội về vấn đề đập trứng, không tồn tại một thủ tục như thế nào thực thụ giỏi hơn phương thức làm sao.

Little endian tốt big endian chỉ khác nhau sống việc lưu trữ sản phẩm công nghệ từ bỏ các byte dữ liệu. Cả hai phương thức đều không có tác dụng ảnh hưởng cho vận tốc cách xử lý của CPU. Thế phải cả nhị phương thức đầy đủ vẫn vĩnh cửu song tuy nhiên và sẽ không còn khi nào hoàn toàn có thể bao gồm một câu trả lời thoả đáng: Phương thơm thức nào thì tốt hơn?

Mỗi cách làm đều phải có hầu hết lợi thế nhất quyết. Với little endian, vày byte bé dại độc nhất luôn nằm bên cạnh trái, nó vẫn cho phép bọn họ gọi dữ liệu cùng với độ nhiều năm tuỳ ý. Nó sẽ rất thích hợp nếu như bọn họ yêu cầu ép vẻ bên ngoài, ví dụ từ bỏ int thành long int.

Với trả định int là 4 byte, long int là 8 byte, giả dụ cần sử dụng little endian, khi xay hình trạng, shop bộ nhớ lưu trữ không cần thiết phải thay đổi, họ chỉ việc ghi tiếp những byte to hơn nhưng mà thôi.

Nhưng nếu như cũng ngôi trường phù hợp kia, nhưng mà thực hiện big endian, thì bọn họ vẫn đề xuất dịch ảnh hưởng bộ nhớ hiện thời thêm 4 byte nữa bắt đầu có không khí nhằm tàng trữ.

Nhưng big endian cũng có nhưng lại điểm mạnh nhất mực, cùng với câu hỏi hiểu dữ liệu byte lớn nhất trước, nó sẽ tương đối thuận tiện kiểm soát một số là âm tuyệt dương, bởi byte chứa dấu được phát âm thứ nhất.

Xem những byte dữ liệu vào cỗ nhớ

Cmùi hương trình C dễ dàng nhau cho họ ý kiến về bài toán bố trí các byte vào bộ lưu trữ.

#include /* function 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 khổng lồ Hotline above function for 0x01234567 */intmain () int i = 0x01234567; show_mem_rep ((char *) &i, sizeof (i)); return 0;khi thực thi lịch trình trên, nếu như trang bị của bạn là little endian thì tác dụng đang là

67 45 23 01còn trường hợp thiết bị chúng ta là big endian thì nó đang hiển thị theo vật dụng từ bỏ thông thường

01 23 45 67Có giải pháp như thế nào nhằm khẳng định máy tính của họ là little endian tốt big endian tốt không? Có vô vàn những bí quyết không giống nhau, dưới đấy là một trong số các phương 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 và dễ dàng trên, c là bé trỏ, nó trỏ đến vùng ghi nhớ của biến đổi i là một số trong những nguyên ổn. Bởi vị số ngulặng là thứ hạng tài liệu các byte, vào khí tài liệu của char chỉ là một byte mà lại thôi, đề xuất *c vẫn trả về quý hiếm là byte trước tiên của số nguim i.

Nếu laptop của bọn họ là little endian thì byte trước tiên này vẫn là một, ngược chở lại thì nó sẽ là 0.

Điều này ảnh hưởng cố như thế nào tới việc lập trình

Về cơ phiên bản thì little endian hay big endian không tồn tại tác động lắm tới việc xây dựng. Phần Khủng những thiết kế viên không yêu cầu quyên tâm nhiều lắm, bởi vì mọi Việc đã có được những trình biên dịch/thông dich phụ trách không còn.

Tuy nhiên, một trong những trường hợp, chúng ta cần quyên tâm, đặc trưng Khi chuyển đổi dữ liệu giữa những máy tính xách tay khác nhau. Ví dụ: Lúc chúng ta phải cách xử trí một file gồm cấu tạo cố gắng này, 4 byte đầu tiên là một vài ngulặng n, kế tiếp là n số nguyên, mỗi số chiếm phần 4 byte bộ nhớ, v.v...

Trong ngôi trường vừa lòng này, lúc thừa nhận tệp tin được tạo thành xuất phát từ 1 máy tính khác, câu hỏi nó được ghi theo phong cách little endian giỏi big endian cụ thể là ảnh hưởng khôn xiết cực kỳ nghiêm trọng, giả dụ sử dụng sai thủ tục, họ sẽ thu về tài liệu không đúng.

Một trường thích hợp khác nữa có thể xảy ra sự việc là khi chúng ta xay loại cho những biến

#include intmain () unsigned char arr<2> = 0x01, 0x00 ; unsigned short int x = *(unsigned short int *) arr; printf ("%d", x); return 0;Trong đoạn code trên, họ vẫn nghiền hình dạng một array hai bộ phận char thành một trong những nguyên 2 byte (short int). Trong ví dụ này, little endian xuất xắc big endian cũng có ảnh hưởng không hề nhỏ.

Một máy tính xách tay cần sử dụng little endian sẽ có được tác dụng là 1 trong những trong lúc big endian vẫn mang lại hiệu quả là 256. Để tránh hầu hết lỗi đáng tiếc rất có thể xảy ra, phần đông code như bên trên cần phải tách.

Vấn đề NUXI

NUXI là 1 trong sự việc hết sức danh tiếng tương quan mang đến little endian với big endian: UNIX được lưu lại vào 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 nhị số ngulặng dạng short int: UN cùng IX.

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

Với bất cứ tài liệu nào thì cũng vậy, chúng ta luôn luôn nhận được dữ liệu đúng ví như đọc với ghi trong cùng một hệ thống. Thế nhưng mà, hãy cẩn thận kỹ hơn về câu hỏi bố trí các byte vào bộ lưu trữ.

Một hệ thống big endian đang lưu trữ nhỏng sau:

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

N U X IMặc cho dù trông tương đối ngược mà lại hệ thống little endian vẫn cách xử trí Việc phát âm góp họ, đề nghị tàng trữ như vậy tuy thế khi mang ra chúng ta vẫn có tài liệu lúc đầu. Thế nhưng Lúc chúng ta ghi tài liệu này ra file, đưa sang một máy vi tính khác. Và từng máy vi tính lại giải pháp xử lý Theo phong cách riêng biệt của nó thì UNIX bên trên lắp thêm big endian sẽ được đọc là NUXI bên trên sản phẩm công nghệ little endian (với ngược lại).

Đây đó là vấn các nguy hại nhất khi họ trao đỏi tài liệu tương hỗ thân những laptop với nhau, đặc biệt trong thời đại Internet thời nay.

Trao thay đổi tài liệu thân các đồ vật gồm endian khác nhau

Ngày ni, mọi laptop số đông được liên kết để thương lượng tài liệu cùng nhau. Little endian giỏi big endian cũng những đề nghị điều đình với nhau, mà lại có tác dụng cố kỉnh nào để có đọc được nhau lúc bọn chúng ko nói thông thường một lắp thêm tiếng?

Có 2 phương án chính mang đến câu hỏi này

Sử dụng bình thường định dạng

Một phương án đơn giản độc nhất vô nhị tất cả thực hiện bình thường một định dang Lúc truyền tài liệu.

lấy ví dụ phần lớn tập tin dạng PNG đầy đủ sẽ phải thực hiện big endian. Tương từ cùng với các tập tin gồm cấu tạo không giống. Đó là nguyên nhân do sao bọn họ thỉnh thoảng cần phải cần sử dụng hầu hết ứng dụng chuyên sử dụng để gọi cùng ghi các tệp tin này.

Thế nhưng trong liên kết cùng với Internet, Việc truyền dữ liệu còn tinh vi chưa dừng lại ở đó. Chúng ta tất yêu cứ đọng dùng một định dạng file như thế nào đó, rồi truyền từng byte một sang đồ vật không giống được. Muốn tăng vận tốc, cần họ đề nghị truyền các byte một lúc.

Và khi ấy chúng ta cần phải có một chuẩn chung. Hiện giờ, chuẩn chỉnh tầm thường cho vấn đề truyền dữ liệu bên trên mạng, hotline là network byte order chính là big endian. Thế dẫu vậy, cho dù sẽ chuẩn chỉnh chung rồi, thỉnh phảng phất vẫn có những giao thức chơi chội hơn, sử dụng little endian.

Để có thể biến đổi dữ liệu thành dữ liệu chuẩn chỉnh theo network byte order, chương trình cần Điện thoại tư vấn hàm hton* (host-to-network) (vào ngữ điệu C). Trong khối hệ thống big endian, hàm này không bắt buộc làm cái gi cả, còn little endian vẫn thực hiện chuyển đối các byte một chút ít.

Dù hệ thống big endian không yêu cầu chuyển đổi dữ liệu, việc hotline hàm này vẫn là khôn cùng quan trọng. Chương trình 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ới tiến hành ở nhiều khối hệ thống khác biệt, việc điện thoại tư vấn hàm này để giúp chúng ta có tác dụng điều này.

Tương tự, ở chiều ngược trở lại, bọn họ phải điện thoại tư vấn hàm ntoh* nhằm biến hóa dữ liệu cảm nhận trường đoản cú mạng về tài liệu máy tính xách tay có thể đọc được. Trong khi, chúng ta còn buộc phải hiểu rõ thứ hạng tài liệu nhưng bọn họ phải chuyển đổi nữa, list các hàm biến đổi nlỗi sau:

htons - "Host to lớn Network Short"htonl- "Host lớn Network Long"ntohs - "Network khổng lồ Host Short"ntohl - "Network lớn Host Long"

Những hàm này khôn cùng đặc biệt quan trọng lúc tiến hành phân chia sẽ dữ liệu ở tầng thấp, ví dụ Lúc khám nghiệm checksum của những gói tin chẳng hạn. Nếu ko hiểu rõ về little endian và big endian thì Khi cần thao tác làm việc về mạng, các bạn sẽ gặp mặt các khó khăn.

Sử dụng BOM (Byte Order Mark)

Một cách thực hiện khác để xử lý sự khác biệt về endian là thực hiện BOM (Byte Order Mark). Đây là một ký kết từ quan trọng đặc biệt, có mức giá trị là 0xFEFF, được ghi ở chỗ đầu tiên của tệp tin.

Nếu độc giả ký từ bỏ này là 0xFFFE (bị ngược) thì tất cả nghĩa tệp tin này được ghi cùng với endian không giống cùng với hệ thống của người sử dụng, khi đó, bạn sẽ cần phải đổi khác cách làm đọc tài liệu một ít.

Có một vài ba vụ việc nhỏ với vấn đề áp dụng BOM. Thứ đọng tuyệt nhất, BOM sẽ gây nên tăng tài liệu được ghi vào file. mặc khi Khi họ chỉ gửi đi 2 byte tài liệu, chúng ta vẫn buộc phải thêm 2 byte BOM nữa.

Xem thêm: Ca Sĩ Linh Miu - Lộ Ngực » Báo Phụ Nữ Việt Nam

Thứ đọng hai, BOM không hoàn toàn thần thánh, bởi vì nó nhờ vào vào xây dựng viên. Có người dân có tâm thì phát âm với giải pháp xử lý Khi chạm mặt BOM, có fan thì trọn vẹn chẳng chú ý nó cùng coi nói nhỏng tài liệu thông thường. Unicode sử dụng BOM Lúc tàng trữ dữ liệu các byte (các cam kết từ Unicode được mã hoá thành 2, 3 thậm chí là 4 byte).