
Little endian và big endian, đó là nhị cách làm khác biệt nhằm tàng trữ tài liệu dạng nhị phân (binary). Bình thường xuyên thì chúng ta cũng chẳng phải quan tâm mang đến bọn chúng làm những gì. Bởi rất nhiều vấn đề sẽ tiến hành tự động hóa hoá không còn.
Bạn đang xem: Big endian là gì
Thế nhưng gồm có tình huống, ví dụ Khi yêu cầu xử lý những tập tin tất cả cấu tạo, tập tin binary, tốt nhất là số đông tập tin được ghi bằng ngữ điệu không giống, thì câu hỏi phát âm về little endian và big endian là khôn xiết đặc biệt. Bởi nếu không, hết sức có thể họ vẫn đọc không nên vật dụng trường đoản cú và cách xử trí với tài liệu được đọc không nên.
Dữ liệuDữ liệu là biểu lộ của đọc tin dưới dạng lưu trữ được. tin tức là đồ vật trừu tượng, không tồn tại dạng hình, sẽ là phần lớn hiểu biết về các sự trang bị, sự việc bao bọc họ. Để lưu trữ, cũng tương tự truyền đạt báo cáo mang đến hầu hết fan, họ nên mang đến dữ liệu. Dữ liệu có thể là chữ viết, hình ảnh được ghi trên giấy tờ, toàn bộ họ tài liệu nhưng bé tín đồ có thể gọi được.
Nhưng phần nhiều tài liệu đó cần được được mã hoá một đợt nữa, giả dụ chúng ta ao ước lưu trữ chúng bên trên máy vi tính. Nhỏng bọn họ mọi biết, máy tính chỉ thao tác làm việc với dữ liệu được mã hoá bên dưới dạng nhị phân, vậy bắt buộc phần nhiều tài liệu cần được mã hoá thành nhị phân mới hoàn toàn có thể xử trí bên trên máy tính xách tay được.
Thực ra điều đó chỉ đúng với laptop số (digital electronic computer). Nghe nói hiện nay laptop lượng tử, máy vi tính sinch học cũng đang rất được cải tiến và phát triển, hy vọng trong vài năm tới, chúng ta đã update lại kiến thức về dữ liệu.
Thực ra, máy tính xách tay không hiểu nhiều được các cam kết trường đoản cú 0, một trong hệ nhị phân đâu, nó vận động theo những biểu lộ điện tử. Mô tả chính xác thì rất cực nhọc, tuy vậy 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 mặt bit 0 thì không tồn tại. bởi vậy, những bit 0, 1 được cách xử lý thành những biểu thị điện tử khớp ứng, với bọn họ coi đó như máy tính xách tay vẫn phát âm được dữ liệu nhị phân.
Thế nhưng, mặc dù thuộc thực hiện biểu thị dạng nhị phân, những máy vi tính không giống nhau cũng ko thực thụ nói phổ biến một ngữ điệu. Cũng y hệt như coi người vậy, Lúc nhìn những cam kết từ a, b, c có tín đồ hiểu, có bạn ko. Máy tính khi quan sát vào những biểu đạt tương xứng cùng với các ký kết hiệu 0 hay 1, mỗi máy vi tính rất có thể phát âm theo một giải pháp khác biệt.
Thế tuy thế, rất may là những máy tính vẫn hoạt động theo hầu như tiêu chuẩn chỉnh tầm thường, thế cho nên nó vẫn rất có thể tiếp xúc cùng nhau được. Tuy nhiên, để ý rằng, chưa phải bất kể lúc làm sao, những máy tính xách tay cũng hoàn toàn có thể gọi được lẫn nhau.
Trong máy tính xách tay, các dữ liệu nhị phân không được cách xử trí theo từng bit đơn thân, mà lại được cách xử lý thành từng khối hận 8 bit một, cùng đơn vị giải pháp xử lý nhỏ duy nhất này Call là byte.
lấy ví dụ như, số nguyên 123456789 được màn biểu diễn bên dưới dạng nhị phân đang là (ở chỗ này tôi nhận định rằng mẫu mã dữ liệu int sẽ sở hữu kích thước là 4 byte, tuy nhiên, nhiều hệ thống 64 bit đang 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ũng có thể viết nó bên dưới dạng hexa nhỏng sau:
07 5b cd 15Đã tất cả bao giờ, chúng ta từ bỏ 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 nào không. Bạn nhận định rằng, nó sẽ được ghi theo thứ tự theo sản phẩm công nghệ trường đoản cú cơ mà họ đã gọi với viết sinh sống bên trên, thì chúng ta đã nhầm.
Đây là biện pháp viết theo kiểu số Ả rập cho họ dễ hiểu thôi, máy vi tính ko "đọc" các ký trường đoản cú giống hệt như họ vì thế nó cũng không lưu trữ tương tự biện pháp họ viết các ký kết trường đoản cú này ra đâu. Việc ghi tài liệu thế nào đó là dịp 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ì cách thức khác nhau để lưu trữ tài liệu. Sự khác hoàn toàn của little endian với big endian khi lưu trữ chính là sinh sống vấn đề bố trí sản phẩm công nghệ từ các byte dữ liệu.
Trong cách thức lưu trữ little endian (xuất phát từ "little-end" nghĩa kết thúc nhỏ dại hơn), byte sau cùng trong biểu diễn nhị phân trên sẽ tiến hành ghi trước. lấy một ví dụ 123456789 ghi theo phong cách little endian sẽ thành
15 cd 5b 07Hơi ngược một chút đúng không? Big endian (bắt nguồn từ "big-end") thì ngược lại, là cách thức ghi tài liệu theo đồ vật từ bỏ bình thường nhưng mà bọn họ vẫn cần sử dụng. 123456789 được tàng trữ vẫn theo đúng lắp thêm từ là
07 5b cd 15Các thuật ngữ big-kết thúc tuyệt little-over khởi đầu từ cuốn nắn tiểu tngày tiết Gulliver du ký kết (Gulliver"s Travels), trong số ấy nhân thứ Lilliputans tranh luận về bài toán buộc phải đập trứng bằng đầu lớn hay nhỏ.
Và ngành IT đã ứng dụng thuật ngữ ngày, tương đối giống cùng với nghĩa gốc. Lưu ý rằng, little endian tốt big endian chỉ khác biệt ngơi nghỉ phương pháp thu xếp các byte tài liệu, còn đồ vật tự 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 lưu ý nữa rằng, little endian tốt big endian chỉ biệt lập lúc bắt buộc tàng trữ đông đảo tài liệu có không ít byte. Những dữ liệu chỉ có 1 byte (ví dụ ký tự ASCII) thì không ảnh hưởng gì (chính xác là dù sử dụng thủ tục nào hiệu quả cũng giống như nhau)
Little endian cùng big endian được dùng trên đông đảo máy vi tính nào?Việc thu xếp các byte dữ liệu theo kiểu little endian giỏi big endian không những xẩy ra lúc chúng ta tàng trữ dữ liệu ra bộ lưu trữ bên cạnh. Mọi hoạt động vui chơi của máy tính xách tay các thực hiện dữ liệu nhị phân, đề xuất little endian/big endian hiện hữu vào số đông buổi giao lưu của máy tính xách tay.
Ngoài Việc thực hiện little endian/big endian 1 phần phụ thuộc vào ứng dụng (do thiết kế viên nắm ý sử dụng 1 trong những hai các loại, hoặc ngôn từ lập trình sẵn biện pháp trước), nó còn phụ thuộc vào vào cỗ vi xử lý của chủ yếu laptop kia.
Các bộ vi cách xử trí Hãng Intel đầy đủ thực hiện little endian, các bộ vi cách xử lý cả ARM trước đó cũng là little endian, tuy vậy hiện tại này ARM đang nâng cấp vi cách xử lý của bản thân thành bi-endian (Có nghĩa là xử lý cả little endian và big endian).
Các cỗ vi cách xử trí PowerPC với SPARK trước đây gần như là big endian, tuy vậy bây chừ chúng cũng rất được nâng cấp thành bi-endian.
Các làm làm sao thì xuất sắc hơn: little endian tuyệt big endian?Little endian tốt big endian cũng tương tự tranh luận nơi bắt đầu về việc đập trứng, không có một cách tiến hành làm sao đích thực xuất sắc rộng cách thức như thế nào.
Little endian tuyệt big endian chỉ khác nhau nghỉ ngơi việc lưu trữ sản phẩm công nghệ từ những byte dữ liệu. Cả hai phương thức phần đa không làm tác động mang đến vận tốc cách xử trí của CPU. Thế phải cả hai cách làm phần đông vẫn sống thọ tuy vậy song và sẽ không còn bao giờ rất có thể có một câu trả lời thoả đáng: Phương thơm thức như thế nào thì giỏi hơn?
Mỗi cách tiến hành đều có hồ hết ưu thế nhất mực. Với little endian, vày byte nhỏ tuổi độc nhất luôn nằm cạnh trái, nó đang chất nhận được chúng ta hiểu dữ liệu với độ dài tuỳ ý. Nó sẽ khá tương thích nếu như chúng ta buộc phải xay dạng hình, ví dụ từ bỏ int thành long int.
Với trả định int là 4 byte, long int là 8 byte, giả dụ dùng little endian, khi ép kiểu, tương tác bộ nhớ không cần phải chuyển đổi, bọn họ chỉ cần ghi tiếp những byte to hơn nhưng mà thôi.
Nhưng giả dụ cũng trường phù hợp đó, nhưng sử dụng big endian, thì chúng ta đang cần dịch can dự bộ nhớ bây chừ thêm 4 byte nữa mới có không gian nhằm tàng trữ.
Nhưng big endian cũng có nhưng mà điểm mạnh một mực, với việc đọc dữ liệu byte lớn nhất trước, nó sẽ rất dễ dãi bình chọn một trong những là âm xuất xắc dương, bởi vì byte chứa vết được hiểu trước tiên.
Xem các byte tài liệu vào cỗ nhớChương thơm trình C dễ dàng và đơn giản nhau mang lại họ quan điểm về vấn đề bố trí các byte vào bộ nhớ.
Xem thêm: Download Sumatra Pdf 3 - Sumatra Pdf: Free Pdf Reader
#include /* function khổng lồ 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 khổng lồ Hotline above sầu 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, ví như máy của bạn là little endian thì công dụng sẽ là
67 45 23 01còn nếu như thứ bạn là big endian thì nó vẫn hiển thị theo trang bị từ thông thường
01 23 45 67Có biện pháp như thế nào nhằm xác minh máy tính xách tay của bọn họ là little endian xuất xắc big endian xuất xắc không? Có vô số các biện pháp khác biệt, bên dưới đó là một trong các các 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 đơn giản dễ dàng bên trên, c là con trỏ, nó trỏ mang đến vùng nhớ của vươn lên là i là một số trong những nguyên. Bởi do số nguim là dạng hình dữ liệu những byte, trong khí dữ liệu của char chỉ là một trong những byte nhưng thôi, cần *c đã trả về giá trị là byte đầu tiên của số nguim i.
Nếu máy vi tính của bọn họ là little endian thì byte trước tiên này vẫn là 1 trong những, ngược chở lại thì nó đã là 0.
Điều này ảnh hưởng cố làm sao tới việc lập trìnhVề cơ bạn dạng thì little endian hay big endian không có tác động lắm tới việc lập trình. Phần phệ các lập trình sẵn viên không yêu cầu quan tâm nhiều lắm, bởi vì hầu như vấ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 trong những ngôi trường thích hợp, họ đề nghị quyên tâm, đặc trưng Lúc biến hóa dữ liệu thân các laptop khác nhau. Ví dụ: Lúc họ yêu cầu giải pháp xử lý một tệp tin tất cả cấu trúc gắng này, 4 byte thứ nhất là một số nguim n, sau đó là n số nguyên, từng số chiếm phần 4 byte bộ nhớ lưu trữ, v.v...
Trong trường đúng theo này, Khi dấn file được tạo thành xuất phát điểm từ 1 laptop khác, việc nó được ghi theo kiểu little endian tốt big endian cụ thể là tác động hết sức rất lớn, nếu như áp dụng sai thủ tục, chúng ta vẫn bỏ túi dữ liệu sai.
Một trường phù hợp khác nữa hoàn toàn có thể xảy ra vụ việc là lúc 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 xay kiểu dáng một array nhị bộ phận char thành một trong những ngulặng 2 byte (short int). Trong ví dụ này, little endian hay big endian cũng có ảnh hưởng rất to lớn.
Một laptop cần sử dụng little endian sẽ sở hữu được hiệu quả là 1 trong những khi big endian vẫn mang lại hiệu quả là 256. Để tránh các lỗi đáng tiếc có thể xảy ra, hầu như code như bên trên rất cần được tránh.
Vấn đề NUXINUXI là một sự việc hết sức nổi tiếng tương quan cho little endian cùng big endian: UNIX được lưu giữ vào một hệ thống big-endian sẽ được đọc là NUXI vào một khối hệ thống little endian.
Giả sử bọn họ phải tàng trữ 4 byte (U, N, I, X) bởi nhì số nguim dạng short int: UN với IX.
#include intmain () short int *s; // pointer to phối 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 lớn next location *s = "IX"; // store second short: I * 256 + X return 0;Đoạn code bên trên hoàn toàn hòa bình cùng với khối hệ thống, bất kể nó là little giỏi big endian. Nếu bọn họ tàng trữ các quý hiếm "UN" và "IX" khi gọi ra, nó vẫn sẽ là "UNIX" giỏi không? Nếu những Việc chỉ xảy ra trên một máy tính, mặc dù cho là big endian xuất xắc little endian thì nó đang luôn là điều đó, vị đông đảo trang bị sẽ tiến hành auto hoá giúp chúng ta.
Với bất kể tài liệu nào thì cũng vậy, họ luôn nhận được tài liệu đúng giả dụ gọi và ghi trong và một khối hệ thống. Thế cơ mà, hãy lưu ý kỹ hơn về Việc thu xếp các byte trong bộ lưu trữ.
Một khối hệ thống big endian sẽ tàng trữ như sau:
U N I XCòn một hệ thống little endian thì đã nhỏng sau:
N U X IMặc mặc dù trông khá ngược tuy thế khối hệ thống little endian đã xử lý câu hỏi đọc góp bọn họ, đề xuất lưu trữ điều này dẫu vậy Lúc lấy ra họ vẫn có dữ liệu thuở đầu. Thế tuy nhiên Lúc bọn họ ghi dữ liệu này ra tệp tin, đưa sang 1 máy tính xách tay không giống. Và mỗi máy tính xách tay lại giải pháp xử lý theo cách riêng của nó thì UNIX bên trên máy big endian sẽ tiến hành gọi là NUXI bên trên vật dụng little endian (với ngược lại).
Đây đó là vấn gần như gian nguy nhất lúc chúng ta trao đỏi dữ liệu tương hỗ thân các laptop cùng nhau, đặc trưng vào thời đại Internet ngày nay.
Trao thay đổi tài liệu giữa các trang bị có endian khác nhauNgày ni, các máy tính đông đảo được liên kết để Bàn bạc dữ liệu với nhau. Little endian giỏi big endian cũng đều nên điều đình với nhau, tuy vậy có tác dụng cầm cố nào để sở hữu gọi được nhau Lúc chúng không nói chung một máy tiếng?
Có 2 chiến thuật thiết yếu cho Việc này
Sử dụng phổ biến định dạng
Một cách thực hiện dễ dàng và đơn giản tốt nhất tất cả áp dụng tầm thường một định dang Lúc truyền dữ liệu.
ví dụ như các tập tin dạng PNG số đông cần phải áp dụng big endian. Tương tự với những tập tin bao gồm kết cấu không giống. Đó là nguyên do bởi sao chúng ta thỉnh thoảng rất cần phải dùng đầy đủ ứng dụng chuyên sử dụng để gọi cùng ghi các file này.
Thế tuy thế vào kết nối với Internet, Việc truyền dữ liệu còn phức tạp không dừng lại ở đó. Chúng ta không thể cđọng cần sử dụng một định hình file làm sao đó, rồi truyền từng byte một sang vật dụng không giống được. Muốn tăng tốc độ, phải họ buộc phải truyền nhiều byte một thời điểm.
Và lúc đó chúng ta cần phải có một chuẩn chỉnh chung. Hiện giờ, chuẩn bình thường mang đến việc truyền tài liệu bên trên mạng, Hotline là network byte order đó là big endian. Thế nhưng mà, mặc dù đã chuẩn bình thường rồi, thỉnh phảng phất vẫn có rất nhiều giao thức chơi chội rộng, thực hiện little endian.
Để hoàn toàn có thể biến đổi dữ liệu thành tài liệu chuẩn chỉnh theo network byte order, chương trình bắt buộc Hotline hàm hton* (host-to-network) (vào ngôn từ C). Trong hệ thống big endian, hàm này sẽ không buộc phải làm gì cả, còn little endian vẫn triển khai đưa đối những byte một chút.
Dù khối hệ thống big endian không yêu cầu chuyển đổi dữ liệu, bài toán Gọi hàm này vẫn là hết sức cần thiết. Chương thơm trình của chúng ta có thể được viết bằng một ngôn ngữ (C) nhưng lại rất có thể được dịch và thực thi sống nhiều khối hệ thống khác nhau, bài toán Gọi hàm này để giúp bọn họ làm điều ấy.
Tương tự, ngơi nghỉ chiều ngược lại, bọn họ phải Điện thoại tư vấn hàm ntoh* nhằm biến hóa tài liệu cảm nhận từ bỏ mạng về dữ liệu máy vi tính rất có thể hiểu được. Dường như, bọn họ còn đề nghị làm rõ hình dạng tài liệu cơ mà họ bắt buộc biến hóa nữa, danh sách những hàm biến hóa như sau:
htons - "Host lớn Network Short"htonl- "Host to lớn Network Long"ntohs - "Network khổng lồ Host Short"ntohl - "Network to Host Long"Những hàm này hết sức quan trọng đặc biệt khi triển khai phân chia đã tài liệu trên tầng rẻ, ví dụ Lúc chất vấn checksum của những gói tin chẳng hạn. Nếu ko làm rõ về little endian và big endian thì Lúc buộc phải thao tác làm việc về mạng, các bạn sẽ gặp gỡ những khó khăn.
Sử dụng BOM (Byte Order Mark)
Một giải pháp khác nhằm giải quyết và xử lý sự khác biệt về endian là sử dụng BOM (Byte Order Mark). Đây là 1 trong những cam kết trường đoản cú đặc trưng, có mức giá trị là 0xFEFF, được ghi ở trong phần thứ nhất của tệp tin.
Nếu độc giả ký kết 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ác cùng với khối hệ thống của bạn, khi ấy, bạn sẽ cần được thay đổi cách làm phát âm tài liệu một chút.
Có một vài ba sự việc bé dại với Việc sử dụng BOM. Thứ đọng duy nhất, BOM sẽ gây nên tăng dữ liệu được ghi vào tệp tin. Ngay cả Khi bọn họ chỉ gửi đi 2 byte dữ liệu, bọn họ vẫn đề nghị thêm 2 byte BOM nữa.
Thứ nhị, BOM không hoàn toàn thần thánh, bởi nó nhờ vào vào lập trình viên. Có người có trung tâm thì hiểu với xử trí khi chạm chán BOM, tất cả fan thì trọn vẹn quên mất nó và coi nói như tài liệu thông thường. Unicode thực hiện BOM lúc tàng trữ dữ liệu các byte (nhiều ký kết tự Unicode được mã hoá thành 2, 3 thậm chí còn là 4 byte).