Bài viết gốc: https://manhhomienbienthuy.bitbucket.io/2018/Sep/20/little-endian-vs-big-endian.html (đang xin phép người sáng tác

*

)

Little endian cùng big endian, đấy là nhì cách tiến hành không giống nhau nhằm lưu trữ dữ liệu dạng nhị phân (binary). Bình thường xuyên thì chúng ta cũng chẳng bắt buộc quyên tâm cho chúng làm cái gi. Bởi đầy đủ Việc sẽ được tự động hóa hoá hết.Bạn vẫn xem: Endian là gì

Thế nhưng mà bao hàm tình huống, ví dụ Lúc bắt buộc xử lý các tập tin có cấu trúc, tập tin binary, độc nhất vô nhị là phần lớn tập tin được ghi bằng ngôn từ khác, thì câu hỏi hiểu về little endian cùng big endian là hết sức quan trọng. Bởi nếu như không, khôn xiết rất có thể chúng ta đang phát âm sai sản phẩm từ cùng cách xử trí với dữ liệu được phát âm sai.

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

Dữ liệu

Dữ liệu là biểu hiện của lên tiếng dưới dạng tàng trữ được. tin tức là trang bị trừu tượng, không có làm ra, chính là gần như phát âm biết về những sự đồ, vấn đề bao quanh chúng ta. Để lưu trữ, cũng tương tự truyền đạt đọc tin mang đến đầy đủ fan, chúng ta đề xuất mang lại dữ liệu. Dữ liệu hoàn toàn có thể là chữ viết, hình hình họa được ghi trên giấy tờ, tất cả chúng ta dữ liệu mà con bạn có thể gọi được.

Nhưng hồ hết dữ liệu kia cần được được mã hoá một đợt nữa, nếu như bọn họ mong mỏi tàng trữ chúng trên máy tính. Như chúng ta số đông biết, máy vi tính chỉ làm việc cùng với dữ liệu được mã hoá dưới dạng nhị phân, vậy bắt buộc đa số dữ liệu rất cần được mã hoá thành nhị phân new hoàn toàn có thể xử trí trên máy tính xách tay được.

Thực ra vấn đề này chỉ đúng với máy vi tính số (digital electronic computer). Nghe nói bây giờ máy tính xách tay lượng tử, máy vi tính sinh học cũng đang được trở nên tân tiến, mong muốn trong vài năm cho tới, bọn họ vẫn 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 ký từ 0, một trong các hệ nhị phân đâu, nó hoạt động theo những biểu đạt năng lượng điện tử. Mô tả chính xác thì khôn xiết nặng nề, tuy vậy bạn cũng có thể hiểu "sơ sơ" rằng, chạm mặt bit 1 thì sẽ sở hữu được cái diện, gặp gỡ bit 0 thì không có. vì thế, các bit 0, 1 được xử trí thành những biểu thị điện tử tương ứng, cùng họ coi kia nhỏng máy vi tính vẫn phát âm được dữ liệu nhị phân.

Thế nhưng lại, mặc dù cùng thực hiện tín hiệu dạng nhị phân, những máy tính khác 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 quan sát những ký tự a, b, c gồm bạn phát âm, có người không. Máy tính khi nhìn vào các tín hiệu tương ứng với những ký hiệu 0 hay là một, từng máy tính xách tay rất có thể hiểu theo một phương pháp khác biệt.

Thế dẫu vậy, khôn xiết may là các máy vi tính vẫn chuyển động theo hầu như tiêu chuẩn tầm thường, vậy nên nó vẫn rất có thể tiếp xúc với nhau được. Tuy nhiên, xem xét rằng, không hẳn bất kể thời điểm nào, những máy tính cũng rất có thể phát âm được cho nhau.

Trong laptop, các tài liệu nhị phân không được xử lý theo từng bit đơn độc, mà được xử trí thành từng kăn năn 8 bit một, và đơn vị cách xử trí bé dại tốt nhất này điện thoại tư vấn là byte.

lấy một ví dụ, số nguim 123456789 được màn trình diễn bên dưới dạng nhị phân vẫn là (tại chỗ này tôi cho rằng hình trạng dữ liệu int sẽ sở hữu kích cỡ là 4 byte, mặc dù, các khối hệ thống 64 bit vẫn nâng size này lên 8 byte)

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

07 5b cd 15Đã bao gồm lúc nào, 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 núm làm sao không. Quý khách hàng nhận định rằng, nó sẽ tiến hành ghi theo thứ tự theo thứ tự mà chúng ta sẽ đọc cùng viết làm việc trên, thì các bạn đang nhầm.

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

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

Little endian với big endian là nhì cách tiến hành khác nhau nhằm lưu trữ dữ liệu. Sự biệt lập của little endian với big endian Lúc lưu trữ chính là sinh sống việc thu xếp trang bị từ bỏ những byte tài liệu.

Trong bề ngoài tàng trữ little endian (bắt nguồn từ "little-end" nghĩa hoàn thành bé dại hơn), byte cuối cùng vào màn biểu diễn nhị phân bên trên sẽ tiến hành ghi trước. lấy ví dụ 123456789 ghi theo phong cách little endian vẫn thành

15 cd 5b 07Hơi ngược một chút đúng không? Big endian (khởi đầu từ "big-end") thì ngược trở lại, là qui định ghi dữ liệu theo máy từ thông thường nhưng mà họ vẫn sử dụng. 123456789 được tàng trữ vẫn theo như đúng sản phẩm từ bỏ là

07 5b cd 15Các thuật ngữ big-kết thúc tốt little-end xuất phát từ cuốn tiểu tmáu Gulliver du ký kết (Gulliver"s Travels), trong số đó nhân đồ vật Lilliputans bàn cãi về vấn đề phải đập trứng bằng đầu to lớn tuyệt nhỏ dại.

Và ngành IT vẫn áp 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 xuất xắc big endian chỉ không giống nhau ngơi nghỉ bí quyết thu xếp những byte tài liệu, còn đồ vật trường đoản cú từng bit vào byte thì kiểu như nhau. Rất may, những laptop vẫn đang còn điểm trung này.

Thêm một chú ý nữa rằng, little endian xuất xắc big endian chỉ khác biệt lúc đề nghị tàng trữ gần như dữ liệu có nhiều byte. Những dữ liệu chỉ có một byte (ví dụ cam kết từ bỏ ASCII) thì ko tác động gì (chính xác là 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 đều máy tính nào?

Việc bố trí các byte dữ liệu theo kiểu little endian tốt big endian không những xảy ra lúc họ lưu trữ tài liệu ra bộ nhớ xung quanh. Mọi hoạt động vui chơi của máy vi tính gần như thực hiện tài liệu nhị phân, đề nghị little endian/big endian tồn tại trong hầu hết hoạt động của máy tính xách tay.

Ngoài câu hỏi thực hiện little endian/big endian 1 phần dựa vào vào phần mềm (vì chưng thiết kế viên thay ý sử dụng một trong hai nhiều loại, hoặc ngôn ngữ lập trình nguyên tắc trước), nó còn dựa vào vào bộ vi xử lý của chính laptop đó.

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

Các cỗ vi giải pháp xử lý PowerPC cùng SPARK trước đó số đông là big endian, mà lại bây giờ bọn chúng cũng rất được tăng cấp thành bi-endian.

Các có tác dụng làm sao thì xuất sắc hơn: little endian hay big endian?

Little endian xuất xắc big endian cũng như bàn cãi cội về Việc đập trứng, không tồn tại một cách tiến hành làm sao đích thực xuất sắc rộng cách tiến hành như thế nào.

Little endian giỏi big endian chỉ khác nhau nghỉ ngơi vấn đề tàng trữ thứ từ bỏ những byte dữ liệu. Cả hai phương thức những không có tác dụng tác động mang đến vận tốc xử trí của CPU. Thế đề xuất cả hai cách làm gần như vẫn sống thọ tuy nhiên tuy vậy và sẽ không lúc nào hoàn toàn có thể gồm một câu vấn đáp thoả đáng: Pmùi hương thức làm sao thì xuất sắc hơn?

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

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

Nhưng ví như cũng ngôi trường hòa hợp kia, nhưng sử dụng big endian, thì chúng ta sẽ yêu cầu dịch xúc tiến bộ nhớ hiện nay thêm 4 byte nữa mới bao gồm không khí nhằm lưu trữ.

Nhưng big endian cũng có dẫu vậy lợi thế nhất quyết, với Việc gọi dữ liệu byte lớn số 1 trước, nó sẽ khá dễ dãi khám nghiệm một số trong những là âm hay dương, vày byte đựng vết được đọc thứ nhất.

Xem các byte dữ liệu vào bộ nhớ

#include /* function lớn 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 lớn Điện thoại tư vấn above sầu function for 0x01234567 */intmain () int i = 0x01234567; show_mem_rep ((char *) &i, sizeof (i)); return 0;khi thực thi công tác trên, nếu thứ của khách hàng là little endian thì công dụng sẽ là

67 45 23 01còn nếu như thứ chúng ta là big endian thì nó đã hiển thị theo đồ vật từ thông thường

01 23 45 67Có cách làm sao để xác minh máy tính xách tay của chúng ta là little endian hay big endian tuyệt không? Có vô vàn các phương pháp khác biệt, dưới đó là một trong những 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 trên, c là nhỏ trỏ, nó trỏ mang đến vùng lưu giữ của biến chuyển i là một số nguyên. Bởi do số nguim là hình dáng dữ liệu các byte, vào khí dữ liệu của char chỉ là 1 trong những byte mà thôi, bắt buộc *c vẫn trả về quý hiếm là byte thứ nhất của số nguyên ổn i.

Xem thêm: " Gói Thầu Tiếng Anh Là Gì ? Gói Thầu (Bidding Package) Là Gì

Nếu máy tính xách tay của chúng ta là little endian thì byte thứ nhất này đã là 1 trong những, trở lại thì nó vẫn là 0.

Vấn đề này tác động cố nào tới sự việc lập trình

Về cơ phiên bản thì little endian giỏi big endian không tồn tại tác động lắm tới việc lập trình sẵn. Phần béo các xây dựng viên không bắt buộc quyên tâm những lắm, vì phần lớn việ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 số trường vừa lòng, họ buộc phải quan tâm, quan trọng Khi biến hóa dữ liệu giữa các laptop không giống nhau. Ví dụ: Lúc chúng ta phải xử trí một file tất cả kết cấu nạm này, 4 byte đầu tiên là một số trong những ngulặng n, sau đó là n số nguyên ổn, từng số chỉ chiếm 4 byte bộ nhớ lưu trữ, v.v...

Trong ngôi trường hợp này, Lúc thừa nhận file được tạo ra xuất phát từ 1 máy vi tính không giống, bài toán nó được ghi theo phong cách little endian tuyệt big endian cụ thể là tác động siêu rất lớn, giả dụ áp dụng không đúng cách thức, họ vẫn tiếp thu tài liệu không nên.

Một ngôi trường phù hợp khác nữa rất có thể xảy ra sự việc là lúc bọn họ nghiền 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, họ sẽ nghiền hình dáng một array nhị bộ phận char thành một số trong những nguyên ổn 2 byte (short int). Trong ví dụ này, little endian xuất xắc big endian cũng có thể có tác động rất cao.

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

Vấn đề NUXI

NUXI là 1 trong những vụ việc rất danh tiếng liên quan cho little endian với big endian: UNIX được giữ trong một hệ thống big-endian sẽ tiến hành gọi là NUXI trong một hệ thống little endian.

Giả sử họ đề xuất lưu trữ 4 byte (U, N, I, X) bằng nhị số ngulặng dạng short int: UN cùng IX.

#include intmain () short int *s; // pointer khổng lồ 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 độc lập với hệ thống, bất kỳ nó là little tuyệt big endian. Nếu bọn họ tàng trữ các quý hiếm "UN" và "IX" khi hiểu ra, nó vẫn vẫn là "UNIX" hay không? Nếu phần nhiều vấn đề chỉ xảy ra trên một máy vi tính, dù cho là big endian tuyệt little endian thì nó sẽ luôn là điều này, vì chưng hầu hết vật dụng sẽ được tự động hóa hoá góp bọn họ.

Với bất cứ tài liệu nào cũng vậy, chúng ta luôn luôn chiếm được tài liệu đúng ví như hiểu với ghi trong cùng một khối hệ thống. Thế nhưng mà, hãy để ý kỹ rộng về bài toán sắp xếp các byte vào bộ lưu trữ.

Một hệ thống big endian vẫn tàng trữ nlỗi sau:

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

N U X IMặc cho dù trông khá ngược cơ mà hệ thống little endian sẽ xử trí việc phát âm giúp chúng ta, nên tàng trữ những điều đó tuy vậy lúc lôi ra họ vẫn đang còn dữ liệu ban sơ. Thế nhưng Khi họ ghi tài liệu này ra tệp tin, gửi sang 1 máy tính xách tay khác. Và từng máy vi tính lại cách xử trí Theo phong cách riêng biệt của chính nó thì UNIX trên lắp thêm big endian sẽ được phát âm là NUXI bên trên thứ little endian (cùng ngược lại).

Đây chính là vấn hầu như nguy khốn nhất lúc chúng ta trao đỏi tài liệu qua lại giữa các laptop cùng nhau, đặc biệt quan trọng trong thời đại Intethời nay.

Trao thay đổi dữ liệu giữa những sản phẩm công nghệ có endian khác nhau

Ngày ni, mọi máy vi tính phần đông được liên kết để Bàn bạc tài liệu với nhau. Little endian xuất xắc big endian cũng hầu hết cần hội đàm cùng nhau, tuy nhiên làm cầm cố như thế nào để có gọi được nhau khi chúng ko nói thông thường một máy tiếng?

Có 2 giải pháp thiết yếu cho vấn đề này

Sử dụng tầm thường định dạng

Một phương án dễ dàng và đơn giản tuyệt nhất tất cả áp dụng phổ biến một định dang Khi truyền dữ liệu.

ví dụ như những tập tin dạng PNG đông đảo bắt buộc phải thực hiện big endian. Tương trường đoản cú cùng với các tập tin tất cả cấu tạo khác. Đó là lý do vị sao chúng ta nhiều khi rất cần được dùng phần lớn phần mềm chuyên được sự dụng nhằm gọi với ghi những file này.

Thế dẫu vậy trong liên kết với Internet, bài toán truyền dữ liệu còn phức tạp không dừng lại ở đó. Chúng ta chẳng thể cđọng dùng một định hình tệp tin làm sao đó, rồi truyền từng byte một lịch sự trang bị không giống được. Muốn nắn tăng vận tốc, bắt buộc họ phải truyền các byte một thời điểm.

Và khi ấy bọn họ cần có một chuẩn thông thường. Hiện nay, chuẩn chỉnh chung mang lại vấn đề truyền dữ liệu trên mạng, hotline là network byte order đó là big endian. Thế tuy vậy, dù vẫn chuẩn phổ biến rồi, thỉnh phảng phất vẫn đang còn hồ hết giao thức chơi chội rộng, áp dụng little endian.

Để có thể biến đổi tài liệu thành tài liệu chuẩn theo network byte order, lịch trình buộc phải Hotline hàm hton* (host-to-network) (trong ngôn ngữ C). Trong khối hệ thống big endian, hàm này sẽ không đề nghị làm gì cả, còn little endian đã thực hiện đưa đối các byte một chút.

Dù khối hệ thống big endian không yêu cầu biến hóa dữ liệu, vấn đề Gọi hàm này vẫn chính là rất cần thiết. Cmùi hương trình của bạn cũng có thể được viết bằng một ngôn ngữ (C) tuy thế có thể được dịch và thực hiện sống nhiều hệ thống khác nhau, vấn đề gọi hàm này để giúp bọn họ có tác dụng điều ấy.

Tương trường đoản cú, sinh hoạt chiều ngược lại, chúng ta đề nghị điện thoại tư vấn hàm ntoh* nhằm thay đổi dữ liệu nhận được tự mạng về dữ liệu máy vi tính có thể gọi được. Trong khi, chúng ta còn phải nắm rõ hình trạng dữ liệu mà lại bọn họ cần thay đổi nữa, danh sách các hàm đổi khác như sau:

htons - "Host khổng lồ Network Short"htonl- "Host lớn 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 đặc biệt Khi triển khai phân tách đang dữ liệu tại tầng thấp, ví dụ lúc bình chọn checksum của các gói tin ví dụ điển hình. Nếu không hiểu rõ về little endian với big endian thì lúc cần thao tác làm việc về mạng, các bạn sẽ gặp gỡ các trở ngại.

Sử dụng BOM (Byte Order Mark)

Một cách thực hiện không giống nhằm giải quyết sự khác biệt về endian là thực hiện BOM (Byte Order Mark). Đây là một trong những ký kết từ bỏ đặc biệt quan trọng, có giá trị là 0xFEFF, được ghi tại vị trí trước tiên của file.

Nếu bạn đọc ký kết tự này là 0xFFFE (bị ngược) thì có nghĩa file này được ghi cùng với endian khác với hệ thống của doanh nghiệp, lúc đó, bạn sẽ rất cần phải biến hóa cách thức đọc dữ liệu một chút.

Xem thêm: Câu Lạc Bộ Tiếng Anh Sở Giao Thông Vận Tải Tiếng Anh Là Gì ?

Thứ đọng nhị, BOM không trọn vẹn thần thánh, bởi nó dựa vào vào xây dựng viên. Có người dân có chổ chính giữa thì gọi cùng xử lý khi gặp gỡ BOM, bao gồm fan thì trọn vẹn chẳng chú ý nó và coi nói nlỗi tài liệu thông thường. Unicode sử dụng BOM lúc lưu trữ dữ liệu các byte (các ký kết từ Unicode được mã hoá thành 2, 3 thậm chí là là 4 byte).