Endian Là Gì

Bài viết gốc: https://manhhomienbienthuy.bitbucket.io/2018/Sep/20/little-endian-vs-big-endian.html (sẽ xin phnghiền người sáng tác


*

)

Little endian cùng big endian, đó là nhì cách thức khác biệt để lưu trữ tài liệu dạng nhị phân (binary). Bình hay thì chúng ta cũng chẳng cần quyên tâm đến bọn chúng làm gì. Bởi gần như bài toán sẽ tiến hành auto hoá hết.quý khách hàng vẫn xem: Endian là gì

Thế nhưng bao gồm tình huống, ví dụ lúc đề nghị cách xử lý các tập tin gồm kết cấu, tập tin binary, độc nhất là đa số tập tin được ghi bằng ngữ điệu khác, thì Việc gọi về little endian và big endian là vô cùng đặc biệt quan trọng. Bởi còn nếu như không, hết sức có thể bọn họ sẽ phát âm không nên sản phẩm từ bỏ với xử lý với tài liệu được gọi không nên.

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

Dữ liệu

Dữ liệu là trình bày của thông báo bên dưới dạng tàng trữ được. Thông tin là đồ vật trừu tượng, không tồn tại hình dáng, sẽ là đa số phát âm biết về các sự vật, sự việc bao bọc chúng ta. Để tàng trữ, cũng giống như truyền đạt ban bố mang lại những fan, họ phải cho 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 cả chúng ta tài liệu mà lại nhỏ tín đồ hoàn toàn có thể hiểu được.

Nhưng các tài liệu kia rất cần phải được mã hoá một đợt tiếp nhữa, trường hợp bọn họ ao ước tàng trữ chúng trên máy tính xách tay. Nlỗi chúng ta hồ hết biết, máy vi tính chỉ làm việc với dữ liệu được mã hoá dưới dạng nhị phân, vậy yêu cầu rất nhiều tài liệu rất cần phải mã hoá thành nhị phân bắt đầu có thể cách xử lý bên trên máy tính được.

Thực ra vấn đề đó chỉ đúng với laptop số (digital electronic computer). Nghe nói bây chừ máy tính xách tay lượng tử, laptop sinc học tập cũng đang rất được cải tiến và phát triển, mong muốn vào vài ba năm cho tới, họ đang update lại kiến thức về tài liệu.

Thực ra, laptop không hiểu biết được những ký tự 0, một trong những hệ nhị phân đâu, nó chuyển động theo các biểu thị năng lượng điện tử. Mô tả đúng mực thì khôn cùng khó khăn, tuy nhiên chúng ta cũng có thể hiểu "sơ sơ" rằng, chạm chán bit 1 thì sẽ sở hữu được chiếc diện, gặp gỡ bit 0 thì không có. Bởi vậy, các bit 0, 1 được cách xử lý thành các biểu thị năng lượng điện tử tương xứng, với chúng ta coi đó nhỏng máy tính sẽ phát âm được tài liệu nhị phân.

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

Thế nhưng lại, vô cùng may là những máy tính vẫn vận động theo phần đông tiêu chuẩn chỉnh tầm thường, thế 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ể cơ hội như thế nào, những laptop cũng hoàn toàn có thể gọi được cho nhau.

Trong laptop, các tài liệu nhị phân không được xử lý theo từng bit riêng lẻ, mà lại được cách xử trí thành từng kân hận 8 bit một, và đơn vị xử lý nhỏ tuổi độc nhất này call 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 sẽ là (ở chỗ này tôi nhận định rằng hình trạng dữ liệu int sẽ sở hữu kích cỡ là 4 byte, tuy nhiên, nhiều khối hệ thống 64 bit đang nâng kích cỡ này lên 8 byte)

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

07 5b cd 15Đã tất cả lúc nào, chúng ta từ bỏ hỏi, Khi ghi tài liệu này bên trên đĩa cứng chẳng hạn, nó được ghi nạm làm sao không. quý khách nhận định rằng, nó sẽ được ghi theo thứ tự theo thiết bị từ cơ mà họ vẫn gọi và viết sinh hoạt bên trên, thì chúng ta đã nhầm.

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

Little endian với big endian là gì?

Little endian cùng big endian là nhị phương thức không giống nhau để lưu trữ dữ liệu. Sự khác hoàn toàn của little endian với big endian Lúc lưu trữ đó là ở vấn đề bố trí thiết bị từ những byte tài liệu.

Trong cơ chế tàng trữ little endian (khởi đầu từ "little-end" nghĩa chấm dứt nhỏ 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ẽ được ghi trước. lấy ví dụ như 123456789 ghi theo kiểu little endian đã thành

15 cd 5b 07Hơi ngược một chút ít đúng không? Big endian (khởi nguồn từ "big-end") thì ngược trở lại, là nguyên tắc ghi tài liệu theo đồ vật trường đoản cú thông thường cơ mà bọn họ vẫn dùng. 123456789 được lưu trữ vẫn theo như đúng đồ vật tự là

07 5b cd 15Các thuật ngữ big-kết thúc tuyệt little-end khởi đầu từ cuốn tè tngày tiết Gulliver du cam kết (Gulliver"s Travels), trong các số đó nhân thứ Lilliputans tranh cãi về bài toán yêu cầu đập trứng bằng đầu to hay bé dại.

Và ngành IT sẽ ứng dụng thuật ngữ ngày, kha khá như là cùng với nghĩa cội. Lưu ý rằng, little endian xuất xắc big endian chỉ khác biệt nghỉ ngơi giải pháp thu xếp những byte tài liệu, còn vật dụng từ từng bit trong byte thì như thể nhau. Rất may, những laptop 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ỉ khác biệt khi buộc phải lưu trữ gần như dữ liệu có nhiều byte. Những tài liệu chỉ có một byte (ví dụ ký kết tự ASCII) thì không tác động gì (đúng là mặc dù dùng phương thức như thế nào hiệu quả cũng như nhau)

Little endian và big endian được dùng bên trên đều máy tính xách tay nào?

Việc sắp xếp các byte dữ liệu theo kiểu little endian hay big endian không chỉ là xẩy ra khi bọn họ tàng trữ tài liệu ra bộ lưu trữ xung quanh. Mọi buổi giao lưu của máy tính xách tay số đông áp dụng dữ liệu nhị phân, bắt buộc little endian/big endian hiện hữu trong các hoạt động của máy vi tính.

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

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

Các bộ vi xử lý PowerPC và SPARK trước đây mọi là big endian, tuy vậy hiện thời bọn chúng cũng rất được tăng cấp thành bi-endian.

Các làm nào thì xuất sắc hơn: little endian giỏi big endian?

Little endian giỏi big endian cũng tương tự tranh biện cội về việc đập trứng, không có một cách làm nào thực thụ xuất sắc rộng thủ tục như thế nào.

Little endian xuất xắc big endian chỉ khác biệt sinh sống vấn đề lưu trữ sản phẩm từ bỏ các byte dữ liệu. Cả nhì cách tiến hành đông đảo không có tác dụng ảnh hưởng cho tốc độ cách xử trí của CPU. Thế đề xuất cả hai phương thức các vẫn sống thọ tuy nhiên song và sẽ không còn lúc nào có thể bao 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 cách làm đều phải sở hữu số đông điểm mạnh nhất định. Với little endian, vì byte nhỏ tốt nhất luôn nằm cạnh trái, nó vẫn được cho phép họ đọc dữ liệu với độ nhiều năm tuỳ ý. Nó sẽ khá thích hợp ví như họ bắt buộc xay thứ hạng, ví dụ từ bỏ int thành long int.

Với đưa định int là 4 byte, long int là 8 byte, trường hợp sử dụng little endian, Lúc nghiền hình dáng, liên quan bộ nhớ không cần phải đổi khác, họ chỉ việc ghi tiếp những byte to hơn mà thôi.

Nhưng giả dụ cũng ngôi trường đúng theo đó, nhưng thực hiện big endian, thì họ đã bắt buộc dịch hệ trọng bộ nhớ lưu trữ bây chừ thêm 4 byte nữa new tất cả không gian nhằm tàng trữ.

Nhưng big endian cũng đều có cơ mà điểm mạnh nhất quyết, với câu hỏi phát âm tài liệu byte lớn nhất trước, nó sẽ tương đối thuận lợi đánh giá một trong những là âm hay dương, vị byte đựng vết được hiểu đầu tiên.

Xem các byte dữ liệu trong bộ nhớ

#include /* function to 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 to lớn Hotline above sầu function for 0x01234567 */intmain () int i = 0x01234567; show_mem_rep ((char *) &i, sizeof (i)); return 0;khi triển khai chương trình bên trên, trường hợp lắp thêm của khách hàng là little endian thì hiệu quả đã là

67 45 23 01còn nếu như sản phẩm chúng ta là big endian thì nó vẫn hiển thị theo thứ từ thông thường

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

Xem thêm: C# Delegate C# Là Gì - Understanding Delegates In C#

Nếu máy vi tính của bọn họ là little endian thì byte thứ nhất này đang là 1, ngược chở lại thì nó đang là 0.

Như vậy tác động cầm nào đến sự việc lập trình

Về cơ phiên bản thì little endian tốt big endian không có tác động lắm tới sự việc lập trình. Phần mập những xây dựng viên không buộc phải quan tâm các lắm, bởi đầy đủ vấn đề đã có được các trình biên dịch/thông dich đảm nhiệm hết.

Tuy nhiên, một trong những ngôi trường phù hợp, họ phải quyên tâm, quan trọng khi biến đổi tài liệu thân những máy vi tính khác biệt. Ví dụ: Khi họ đề xuất xử lý một tệp tin bao gồm cấu trúc thay này, 4 byte đầu tiên là một trong những ngulặng n, tiếp đến là n số ngulặng, mỗi số chiếm 4 byte bộ nhớ, v.v...

Trong ngôi trường thích hợp này, khi thừa nhận tệp tin được tạo thành xuất phát điểm từ một laptop không giống, bài toán nó được ghi theo kiểu little endian tốt big endian rõ ràng là ảnh hưởng vô cùng rất lớn, giả dụ áp dụng không nên cách thức, họ đang đuc rút dữ liệu sai.

Một trường đúng theo không giống nữa rất có thể xảy ra vụ việc là khi bọn họ nghiền hình dạng 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 bên trên, bọn họ vẫn nghiền hình trạng một array nhì phần tử char thành một số ngulặng 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 nhỏ.

Một laptop cần sử dụng little endian sẽ sở hữu được hiệu quả là 1 trong trong những khi big endian đã mang đến tác dụng là 256. Để tránh đông đảo lỗi không mong muốn có thể xẩy ra, phần đông code như bên trên cần được rời.

Vấn đề NUXI

NUXI là một trong những vụ việc rất danh tiếng liên quan đến little endian cùng big endian: UNIX được giữ vào một hệ thống big-endian sẽ được phát âm là NUXI trong một khối hệ thống little endian.

Giả sử họ cần lưu trữ 4 byte (U, N, I, X) bằng hai số nguyên ổn dạng short int: UN và IX.

#include intmain () short int *s; // pointer khổng lồ mix 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 hệ thống, bất cứ nó là little tốt big endian. Nếu bọn họ lưu trữ những quý hiếm "UN" và "IX" Lúc đọc ra, nó vẫn vẫn là "UNIX" giỏi không? Nếu số đông câu hỏi chỉ xảy ra trên một laptop, dù là big endian tuyệt little endian thì nó vẫn luôn là điều đó, bởi vì gần như trang bị sẽ được tự động hóa hoá giúp họ.

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

Một khối 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ỏng sau:

N U X IMặc mặc dù trông hơi ngược mà lại hệ thống little endian sẽ xử trí Việc đọc góp họ, yêu cầu lưu trữ điều này nhưng mà khi kéo ra chúng ta vẫn có dữ liệu ban đầu. Thế mà lại Lúc chúng ta ghi tài liệu này ra file, chuyển qua 1 máy tính không giống. Và mỗi laptop lại xử lý Theo phong cách riêng của chính nó thì UNIX trên sản phẩm big endian sẽ được hiểu là NUXI trên đồ vật little endian (với ngược lại).

Đây chính là vấn hồ hết nguy khốn nhất lúc bọn họ trao đỏi tài liệu hỗ tương thân các máy vi tính cùng nhau, đặc biệt quan trọng trong thời đại Intethời nay.

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

Ngày ni, những máy vi tính đều được kết nối nhằm trao đổi tài liệu với nhau. Little endian hay big endian cũng đông đảo cần Bàn bạc với nhau, dẫu vậy làm cho nắm như thế nào để sở hữu đọ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 chiến thuật thiết yếu mang đến bài toán này

Sử dụng phổ biến định dạng

Một giải pháp dễ dàng độc nhất vô nhị tất cả sử dụng tầm thường một định dang khi truyền dữ liệu.

Ví dụ số đông tập tin dạng PNG số đông sẽ phải áp dụng big endian. Tương trường đoản cú với các tập tin gồm kết cấu không giống. Đó là lý do bởi vì sao họ thỉnh thoảng rất cần được sử dụng phần nhiều ứng dụng chuyên được sự dụng để phát âm và ghi các file này.

Thế mà lại vào kết nối cùng với Internet, vấn đề truyền tài liệu còn phức hợp hơn thế nữa. Chúng ta quan yếu cứ dùng một format tệp tin nào đó, rồi truyền từng byte một sang vật dụng khác được. Muốn nắn tăng vận tốc, cần bọn họ buộc phải truyền những byte một thời điểm.

Và lúc ấy chúng ta cần phải có một chuẩn chỉnh thông thường. Trong thời điểm này, chuẩn chỉnh thông thường mang lại Việc truyền dữ liệu trên mạng, điện thoại tư vấn là network byte order đó là big endian. Thế mà lại, mặc dù đã chuẩn thông thường rồi, thỉnh phảng phất vẫn đang còn đều giao thức chơi chội rộng, áp dụng little endian.

Để hoàn toàn có thể thay đổi tài liệu thành tài liệu chuẩn theo network byte order, công tác đề xuất Call hàm hton* (host-to-network) (vào ngữ điệu C). Trong khối hệ thống big endian, hàm này sẽ không yêu cầu làm cái gi cả, còn little endian đang thực hiện đưa đối những byte một chút.

Dù khối hệ thống big endian ko đề nghị đổi khác dữ liệu, bài toán Hotline hàm này vẫn chính là khôn cùng quan trọng. Chương trình của chúng ta cũng có thể được viết bằng một ngôn từ (C) nhưng có thể được dịch và thực hiện nghỉ ngơi những khối hệ thống không giống nhau, việc điện thoại tư vấn hàm này để giúp đỡ bọn họ có tác dụng điều này.

Tương từ bỏ, sống chiều ngược chở lại, chúng ta phải Call hàm ntoh* nhằm biến đổi 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 hoàn toàn có thể hiểu được. Bên cạnh đó, bọn họ còn buộc phải nắm rõ đẳng cấp dữ liệu nhưng mà chúng ta yêu cầu chuyển đổi nữa, list các hàm thay đổi nhỏng sau:

htons - "Host to Network Short"htonl- "Host to lớn Network Long"ntohs - "Network lớn Host Short"ntohl - "Network to lớn Host Long"

Những hàm này cực kì quan trọng Lúc tiến hành chia sẽ dữ liệu tại tầng phải chăng, ví dụ khi khám nghiệm checksum của các gói tin ví dụ điển hình. Nếu không làm rõ về little endian và big endian thì khi yêu cầu thao tác làm việc về mạng, các bạn sẽ gặp gỡ 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à áp dụng BOM (Byte Order Mark). Đây là 1 trong những ký kết từ bỏ quan trọng đặc biệt, có giá trị là 0xFEFF, được ghi tại đoạn đầu tiên của tệp tin.

Nếu bạn đọc cam 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ông giống với hệ thống của người tiêu dùng, khi đó, các bạn sẽ rất cần được thay đổi cách tiến hành hiểu dữ liệu một chút.

Thứ đọng nhì, BOM ko hoàn toàn thần thánh, bởi vì nó phụ thuộc vào vào lập trình sẵn viên. Có người dân có vai trung phong thì phát âm với cách xử lý Lúc gặp mặt BOM, có người thì trọn vẹn quên mất nó và coi nói như tài liệu thường thì. Unicode thực hiện BOM lúc tàng trữ tài liệu những byte (các ký kết tự Unicode được mã hoá thành 2, 3 thậm chí còn là 4 byte).