Endian là gì

  -  
*
)

Little endian và big endian, đây là nhị cách tiến hành khác biệt để tàng trữ dữ liệu dạng nhị phân (binary). Bình thường thì chúng ta cũng chẳng đề xuất quan tâm đến chúng làm cái gi. Bởi phần đông vấn đề sẽ được tự động hoá hết.

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

Thế nhưng lại bao hàm trường hợp, ví dụ khi nên cách xử trí các tập tin bao gồm cấu tạo, tập tin binary, nhất là những tập tin được ghi bởi ngôn ngữ không giống, thì vấn đề gọi về little endian và big endian là hết sức đặc trưng. Bởi nếu như không, khôn cùng có thể chúng ta vẫn gọi không đúng vật dụng trường đoản cú với giải pháp xử lý với dữ liệu được đọc sai.

Dữ liệu

Dữ liệu là mô tả của báo cáo bên dưới dạng tàng trữ được. Thông tin là sản phẩm công nghệ trừu tượng, không tồn tại bản thiết kế, chính là đông đảo hiểu biết về những sự đồ dùng, vấn đề bao quanh bọn họ. Để lưu trữ, cũng tương tự truyền đạt công bố cho đầy đủ bạn, bọn họ nên mang đến 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, toàn bộ họ dữ liệu mà bé tín đồ có thể đọc được.

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

Thực ra vấn đề này chỉ đúng với laptop số (digital electronic computer). Nghe nói hiện giờ laptop lượng tử, laptop sinh học cũng đang được cách tân và phát triển, mong muốn trong vài ba năm tới, bọn họ vẫn update lại kỹ năng về tài liệu.

Thực ra, máy tính thiếu hiểu biết được các ký kết trường đoản cú 0, một trong những hệ nhị phân đâu, nó vận động theo các biểu hiện điện tử. Mô tả đúng chuẩn thì hết sức nặng nề, tuy nhiên bạn cũng có thể hiểu "sơ sơ" rằng, gặp bit 1 thì sẽ có được chiếc diện, chạm chán bit 0 thì không tồn tại. Vậy nên, các bit 0, 1 được cách xử trí thành những tín hiệu năng lượng điện tử tương ứng, và bọn họ coi kia như máy tính xách tay đang hiểu được tài liệu nhị phân.

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

Thế tuy nhiên, rất may là những laptop vẫn chuyển động theo đều tiêu chuẩn thông thường, vậy nên nó vẫn rất có thể tiếp xúc với nhau được. Tuy nhiên, chú ý rằng, chưa hẳn bất cứ lúc làm sao, những máy tính xách tay cũng có thể hiểu được cho nhau.

Trong laptop, các tài liệu nhị phân ko được cách xử trí theo từng bit chơ vơ, nhưng mà được cách xử trí thành từng khối hận 8 bit một, với đơn vị cách xử lý nhỏ tuổi độc nhất này gọi là byte.

ví dụ như, số nguyên 123456789 được màn biểu diễn bên dưới dạng nhị phân đã là (tại chỗ này tôi nhận định rằng loại tài liệu int sẽ sở hữu được size là 4 byte, mặc dù, những hệ thống 64 bit đang nâng size này lên 8 byte)

00000111 01011011 11001101 00010101Để ngắn gọn gàng, bạn có thể viết nó dưới dạng hexa nlỗi sau:

07 5b cd 15Đã có bao giờ, chúng ta trường đoản cú hỏi, Khi ghi tài liệu này trên đĩa cứng ví dụ điển hình, nó được ghi cố như thế nào chưa. Quý khách hàng cho rằng, nó sẽ tiến hành ghi thứu tự theo lắp thêm từ bỏ mà lại chúng ta đã gọi và viết ở bên trên, thì bạn sẽ nhầm.

Đây là phương pháp viết theo phong cách số Ả rập cho bọn họ dễ dàng nắm bắt thôi, máy vi tính ko "đọc" những ký kết từ bỏ hệt như họ vì thế nó cũng ko lưu trữ tương tự biện pháp bọn họ viết các cam kết tự này ra đâu. Việc ghi dữ liệu ra sao chính là dịp little endian cùng big endian được sử dụng đến.

Little endian và big endian là gì?

Little endian và big endian là nhì cách tiến hành không giống nhau để tàng trữ dữ liệu. Sự khác hoàn toàn của little endian với big endian Khi lưu trữ đó là sống câu hỏi thu xếp thứ từ các byte dữ liệu.

Trong cách thức lưu trữ little endian (khởi nguồn từ "little-end" nghĩa hoàn thành nhỏ dại hơn), byte ở đầu cuối 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 một ví dụ 123456789 ghi theo kiểu little endian đã thành

15 cd 5b 07Hơi ngược một chút đúng không? Big endian (bắt đầu từ "big-end") thì ngược trở lại, là bề ngoài ghi tài liệu theo vật dụng từ bỏ bình thường nhưng mà bọn họ vẫn sử 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-over tốt little-over xuất phát từ cuốn nắn tiểu thuyết Gulliver du ký (Gulliver"s Travels), trong số ấy nhân trang bị Lilliputans tranh biện về Việc bắt buộc đập trứng bởi đầu khổng lồ tuyệt bé dại.

Và ngành IT đã vận dụng thuật ngữ ngày, tương đối tương tự cùng với nghĩa gốc. Lưu ý rằng, little endian xuất xắc big endian chỉ khác nhau nghỉ ngơi cách thu xếp những byte dữ liệu, còn đồ vật trường đoản cú từng bit vào byte thì tương đương nhau. Rất may, những máy vi tính vẫn đang còn điểm trung này.

Thêm một xem xét nữa rằng, little endian tuyệt big endian chỉ biệt lập khi cần tàng trữ mọi dữ liệu có khá nhiều byte. Những tài liệu chỉ có 1 byte (ví dụ cam kết tự ASCII) thì ko ảnh hưởng gì (đúng là mặc dù dùng thủ tục như thế nào công dụng cũng giống như nhau)

Little endian với big endian được sử dụng bên trên đều máy vi tính nào?

Việc bố trí các byte dữ liệu theo kiểu little endian tuyệt big endian không chỉ là xảy ra Khi chúng ta tàng trữ dữ liệu ra bộ lưu trữ ngoại trừ. Mọi buổi giao lưu của laptop mọi áp dụng tài liệu nhị phân, đề nghị little endian/big endian tồn tại vào hầu hết buổi giao lưu của máy tính xách tay.

Ngoài Việc áp dụng little endian/big endian 1 phần phụ thuộc vào phần mềm (vì chưng thiết kế viên nạm ý sử dụng một trong nhì nhiều loại, hoặc ngôn từ lập trình sẵn khí cụ trước), nó còn nhờ vào vào cỗ vi giải pháp xử lý của thiết yếu laptop đó.

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

Các bộ vi xử lý PowerPC với SPARK trước đó phần đa là big endian, nhưng lại hiện giờ bọn chúng cũng được upgrade thành bi-endian.

Các làm làm sao thì tốt hơn: little endian xuất xắc big endian?

Little endian xuất xắc big endian cũng như tranh luận gốc về bài toán đập trứng, không có một phương thức nào thực thụ tốt hơn phương thức như thế nào.

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

Mỗi cách thức đều có hầu hết lợi thế nhất định. Với little endian, bởi byte bé dại duy nhất luôn nằm cạnh trái, nó đang có thể chấp nhận được chúng ta đọc dữ liệu cùng với độ nhiều năm tuỳ ý. Nó sẽ tương đối phù hợp nếu chúng ta cần xay phong cách, ví dụ tự int thành long int.

Với đưa định int là 4 byte, long int là 8 byte, giả dụ dùng little endian, Khi ép đẳng cấp, shop bộ nhớ không nhất thiết phải đổi khác, bọn họ chỉ việc ghi tiếp những byte to hơn nhưng mà thôi.

Nhưng giả dụ cũng ngôi trường thích hợp đó, nhưng sử dụng big endian, thì họ sẽ cần dịch xúc tiến bộ lưu trữ hiện giờ thêm 4 byte nữa mới có không khí nhằm lưu trữ.

Nhưng big endian cũng có thể có tuy nhiên ưu thế cố định, cùng với Việc đọc dữ liệu byte lớn nhất trước, nó sẽ rất thuận tiện kiểm soát một số là âm tốt dương, vì chưng byte chứa vết được hiểu thứ nhất.

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

Cmùi hương trình C đơn giản và dễ dàng nhau mang lại họ quan điểm về việc bố trí các byte trong bộ lưu trữ.

Xem thêm: &Apos; Đông Phương Bất Bại Trần Kiều Ân Xin Lỗi Vì Say Rượu Lái Xe

#include /* function khổng lồ 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 lớn call above sầu function for 0x01234567 */intmain () int i = 0x01234567; show_mem_rep ((char *) &i, sizeof (i)); return 0;khi triển khai lịch trình trên, trường hợp trang bị của doanh nghiệp là little endian thì công dụng vẫn là

67 45 23 01còn trường hợp đồ vật các bạn là big endian thì nó đã hiển thị theo vật dụng trường đoản cú thông thường

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

Nếu laptop của họ là little endian thì byte trước tiên này đang là 1, ngược chở lại thì nó vẫn là 0.

Như vậy ảnh hưởng vắt làm sao tới sự việc lập trình

Về cơ bạn dạng thì little endian xuất xắc big endian không tồn tại tác động lắm đến sự việc thiết kế. Phần bự các xây dựng viên không yêu cầu quyên tâm các lắm, vị hầu hết việc đã được các trình biên dịch/thông dich đảm nhận không còn.

Tuy nhiên, một trong những trường hòa hợp, họ nên quyên tâm, quan trọng đặc biệt Lúc biến đổi dữ liệu giữa những máy vi tính không giống nhau. Ví dụ: Khi chúng ta bắt buộc xử trí một tệp tin gồm cấu trúc chũm này, 4 byte thứ nhất là một trong những ngulặng n, sau đó là n số ngulặng, từng số chiếm phần 4 byte bộ nhớ lưu trữ, v.v...

Trong ngôi trường vừa lòng này, Lúc dấn tệp tin được tạo thành từ một laptop khác, Việc nó được ghi theo kiểu little endian tuyệt big endian rõ ràng là ảnh hưởng siêu nghiêm trọng, giả dụ thực hiện không đúng phương thức, họ đang đuc rút dữ liệu không nên.

Một ngôi trường đúng theo không giống nữa hoàn toàn có thể xảy ra vụ việc là lúc chúng ta nghiền 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ọ sẽ ép phong cách một array nhị thành phần char thành một vài nguyên 2 byte (short int). Trong ví dụ này, little endian tốt big endian cũng có ảnh hưởng không nhỏ.

Một máy vi tính dùng little endian sẽ sở hữu được kết quả là một trong trong những khi big endian vẫn mang đến kết quả là 256. Để tránh gần như lỗi không mong muốn hoàn toàn có thể xảy ra, phần nhiều code nhỏng bên trên cần phải tách.

Vấn đề NUXI

NUXI là một vụ việc rất danh tiếng liên quan mang đến little endian cùng big endian: UNIX được giữ trong 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 phải lưu trữ 4 byte (U, N, I, X) bằng nhì số nguyên ổn dạng short int: UN cùng IX.

#include intmain () short int *s; // pointer to phối shorts s = (short int *)malloc(sizeof(short int)); // point khổng lồ 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 hoàn toàn tự do cùng với khối hệ thống, bất cứ nó là little giỏi big endian. Nếu chúng ta lưu trữ các quý hiếm "UN" với "IX" Lúc phát âm ra, nó vẫn sẽ là "UNIX" hay không? Nếu phần đa câu hỏi chỉ xẩy ra trên một laptop, mặc dù là big endian tốt little endian thì nó sẽ luôn luôn là như vậy, vày số đông vật dụng sẽ tiến hành tự động hóa hoá giúp bọn họ.

Với bất kể tài liệu nào cũng vậy, bọn họ luôn luôn chiếm được tài liệu đúng nếu như hiểu và ghi trong cùng một khối hệ thống. Thế nhưng, hãy để mắt tới kỹ hơn về việc bố trí những byte vào bộ lưu trữ.

Một khối hệ thống big endian đã tàng trữ nlỗi sau:

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

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

Đây đó là vấn đa số gian nguy nhất khi họ trao đỏi tài liệu tương hỗ giữa những máy tính cùng nhau, quan trọng đặc biệt vào thời đại Internet thời nay.

Trao đổi tài liệu thân các lắp thêm có endian khác nhau

Ngày ni, các laptop đa số được liên kết để đàm phán tài liệu với nhau. Little endian tuyệt big endian cũng hồ hết đề nghị hiệp thương cùng nhau, tuy vậy làm cầm cố làm sao để có đọc được nhau Lúc bọn chúng ko nói thông thường một vật dụng tiếng?

Có 2 phương án bao gồm mang lại Việc này

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

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

Ví dụ số đông tập tin dạng PNG đa số cần 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ác. Đó là lý do vì chưng sao chúng ta thỉnh thoảng cần phải sử dụng đông đảo phần mềm chuyên dụng để gọi và ghi những file này.

Thế dẫu vậy trong liên kết với Internet, vấn đề truyền dữ liệu còn tinh vi không những thế. Chúng ta bắt buộc cứ sử dụng một định dạng tệp tin nào kia, rồi truyền từng byte một sang thứ không giống được. Muốn tăng vận tốc, nên chúng ta đề xuất truyền nhiều byte một thời gian.

Và khi đó họ cần phải có một chuẩn chỉnh chung. Hiện giờ, chuẩn chung cho câu hỏi truyền tài liệu bên trên mạng, Điện thoại tư vấn là network byte order chính là big endian. Thế cơ mà, dù sẽ chuẩn chỉnh thông thường rồi, thỉnh phảng phất vẫn đang còn đông đảo giao thức đùa chội hơn, thực hiện little endian.

Để hoàn toàn có thể thay đổi dữ liệu thành dữ liệu chuẩn chỉnh theo network byte order, lịch trình bắt buộc call hàm hton* (host-to-network) (trong ngôn ngữ C). Trong khối hệ thống big endian, hàm này không đề nghị làm cái gi cả, còn little endian vẫn thực hiện chuyển đối những byte một chút.

Dù khối hệ thống big endian ko buộc phải chuyển đổi tài liệu, vấn đề Điện thoại tư vấn hàm này vẫn chính là cực kỳ cần thiết. Chương trình của bạn cũng có thể được viết bởi một ngôn từ (C) cơ mà hoàn toàn có thể được dịch cùng xúc tiến sinh hoạt các khối hệ thống khác biệt, việc điện thoại tư vấn hàm này để giúp đỡ bọn họ làm cho điều đó.

Tương từ bỏ, làm việc chiều trở lại, bọn họ đề nghị Hotline hàm ntoh* để biến đổi dữ liệu nhận thấy từ bỏ mạng về tài liệu máy tính hoàn toàn có thể phát âm được. Ngoài ra, bọn họ còn nên nắm rõ dạng hình dữ liệu cơ mà chúng ta phải chuyển đổi nữa, danh sách các hàm thay đổi như sau:

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

Sử dụng BOM (Byte Order Mark)

Một phương pháp khác để giải quyết sự khác hoàn toàn về endian là áp dụng BOM (Byte Order Mark). Đây là 1 cam kết tự đặc biệt quan trọng, có giá trị là 0xFEFF, được ghi tại phần thứ nhất của tệp tin.

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

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

Xem thêm: Cách Chơi Liên Minh Huyền Thoại Giỏi, Cách Chơi Liên Minh Giỏi

Thứ nhì, BOM không hoàn toàn thần thánh, bởi nó phụ thuộc vào vào xây dựng viên. Có người dân có trung tâm thì đọc và cách xử lý Lúc chạm chán BOM, gồm fan thì trọn vẹn không để ý nó cùng coi nói nhỏng dữ liệu thường thì. Unicode thực hiện BOM lúc lưu trữ dữ liệu nhiều byte (những ký kết từ bỏ Unicode được mã hoá thành 2, 3 thậm chí là 4 byte).