LITTLE ENDIAN LÀ GÌ

     

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

*

)

Little endian cùng big endian, đấy là nhị cách tiến hành khác nhau nhằm tàng trữ dữ liệu dạng nhị phân (binary). Bình hay thì chúng ta cũng chẳng bắt buộc quan tâm mang đến chúng làm những gì. Bởi đa số Việc sẽ tiến hành tự động hóa hoá hết.quý khách hàng vẫn xem: Big endian là gì

Thế cơ mà có những trường hợp, ví dụ lúc phải giải pháp xử lý các tập tin bao gồm cấu trúc, tập tin binary, độc nhất vô nhị là số đông tập tin được ghi bằng ngữ điệu khác, thì Việc đọc về little endian với big endian là khôn xiết đặc biệt quan trọng. Bởi nếu như không, siêu rất có thể bọn họ sẽ gọi không đúng máy tự cùng xử lý với dữ liệu được gọi không đúng.

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

Dữ liệu

Dữ liệu là mô tả của ban bố dưới dạng lưu trữ được. Thông tin là trang bị trừu tượng, không tồn tại ngoài mặt, đó là đầy đủ gọi biết về những sự thứ, vấn đề bao phủ bọn họ. Để lưu trữ, cũng tương tự truyền đạt đọc tin cho mọi bạn, họ đề xuất cho tài liệu. Dữ liệu có thể là chữ viết, hình ảnh được ghi trên chứng từ, tất cả bọn họ tài liệu nhưng con người có thể phát âm được.

Nhưng đa số dữ liệu kia rất cần được được mã hoá một đợt tiếp nhữa, nếu bọn họ ao ước tàng trữ chúng trên máy tính xách tay. Nhỏng họ những biết, máy vi tính chỉ thao tác với dữ liệu được mã hoá dưới dạng nhị phân, vậy cần gần như dữ liệu cần được mã hoá thành nhị phân mới hoàn toàn có thể cách xử lý bên 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 thời laptop lượng tử, laptop sinc học cũng đang rất được trở nên tân tiến, hy vọng vào vài năm cho tới, chúng ta đang update lại kỹ năng và kiến thức về tài liệu.

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

Thế mà lại, tuy vậy thuộc sử dụng biểu lộ dạng nhị phân, những laptop không giống nhau cũng ko thực sự nói phổ biến một ngôn từ. Cũng y hệt như coi tín đồ vậy, khi quan sát những cam kết trường đoản cú a, b, c bao gồm người gọi, gồm bạn ko. Máy tính Lúc quan sát vào những biểu lộ khớp ứng cùng với những ký hiệu 0 hay một, từng laptop có thể hiểu theo một bí quyết không giống nhau.

Thế tuy vậy, vô cùng may là những máy tính vẫn hoạt động theo đông đảo tiêu chuẩn chỉnh thông thường, vậy cho nên nó vẫn rất có thể tiếp xúc cùng nhau được. Tuy nhiên, để ý rằng, không phải bất cứ lúc như thế nào, những máy tính xách tay cũng có thể đọc được cho 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 riêng biệt, cơ mà được xử lý thành từng kăn năn 8 bit một, và đơn vị chức năng giải pháp xử lý nhỏ dại duy nhất này điện thoại tư vấn là byte.

Ví dụ, số nguim 123456789 được màn biểu diễn bên dưới dạng nhị phân vẫn là (ở chỗ này tôi cho rằng đẳng cấp tài liệu int sẽ sở hữu được form size là 4 byte, mặc dù, nhiều khối hệ thống 64 bit đang nâng size 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 nlỗi sau:

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

Đây là bí quyết viết theo phong cách số Ả rập mang lại bọn họ dễ dàng nắm bắt thôi, máy tính ko "đọc" những cam kết từ giống hệt như chúng ta cho nên nó cũng ko lưu trữ như thể giải pháp bọn họ viết các ký kết từ này ra đâu. Việc ghi tài liệu thế nào chính là lúc 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 tiến hành không giống nhau để lưu trữ tài liệu. Sự biệt lập của little endian cùng big endian lúc tàng trữ chính là sinh sống câu hỏi sắp xếp sản phẩm tự những byte tài liệu.

Trong nguyên lý lưu trữ little endian (khởi đầu từ "little-end" nghĩa xong xuôi nhỏ tuổi hơn), byte sau cuối vào màn trình diễn nhị phân trên sẽ tiến hành ghi trước. lấy ví dụ 123456789 ghi theo kiểu little endian đang 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 lại, là phép tắc ghi dữ liệu theo lắp thêm tự bình thường mà bọn họ vẫn cần sử dụng. 123456789 được tàng trữ vẫn theo đúng thứ trường đoản cú là

07 5b cd 15Các thuật ngữ big-kết thúc tốt little-over bắt đầu từ cuốn nắn tè tmáu Gulliver du ký (Gulliver"s Travels), trong đó nhân đồ vật Lilliputans tranh cãi về câu hỏi cần đập trứng bằng đầu to giỏi nhỏ tuổi.

Và ngành IT đã vận dụng thuật ngữ ngày, tương đối như là với nghĩa cội. Lưu ý rằng, little endian tốt big endian chỉ không giống nhau ngơi nghỉ cách thu xếp những byte dữ liệu, còn sản phẩm công nghệ từ bỏ từng bit vào byte thì kiểu như nhau. Rất may, những máy vi tính vẫn có điểm trung này.

Thêm một để ý nữa rằng, little endian giỏi big endian chỉ khác hoàn toàn khi bắt buộc lưu trữ những dữ liệu có nhiều byte. Những dữ liệu chỉ có một byte (ví dụ ký trường đoản cú ASCII) thì không ảnh hưởng gì (chính xác là dù sử dụng cách làm làm sao tác dụng cũng như nhau)

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

Việc sắp xếp các byte dữ liệu theo phong cách little endian tốt big endian không chỉ có xẩy ra lúc bọn họ tàng trữ dữ liệu ra bộ nhớ lưu trữ ngoài. Mọi hoạt động của máy tính gần như áp dụng dữ liệu nhị phân, đề xuất little endian/big endian tồn tại trong gần như hoạt động của máy tính xách tay.

Ngoài bài toán thực hiện little endian/big endian một phần dựa vào vào ứng dụng (vì xây dựng viên nỗ lực ý sử dụng 1 trong nhì loại, hoặc ngôn từ thiết kế phương pháp trước), nó còn dựa vào vào bộ vi giải pháp xử lý của chủ yếu laptop đó.

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

Các cỗ vi cách xử lý PowerPC cùng SPARK trước đây phần đông là big endian, tuy nhiên hiện thời chúng cũng được nâ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 hay big endian cũng như bàn cãi cội về vấn đề đập trứng, không tồn tại một cách thức nào thực sự xuất sắc hơn cách làm như thế nào.

Little endian tuyệt big endian chỉ khác nhau ở vấn đề tàng trữ đồ vật từ những byte tài liệu. Cả nhị phương thức những không làm ảnh hưởng cho tốc độ xử trí của CPU. Thế yêu cầu cả nhị cách làm rất nhiều vẫn trường tồn tuy nhiên song với sẽ không khi nào có thể gồm một câu trả lời thoả đáng: Pmùi hương thức làm sao thì giỏi hơn?

Mỗi thủ tục đều phải sở hữu đầy đủ điểm mạnh nhất mực. Với little endian, vày byte bé dại độc nhất luôn luôn nằm bên trái, nó đang có thể chấp nhận được chúng ta phát âm dữ liệu với độ nhiều năm tuỳ ý. Nó sẽ khá thích hợp ví như họ cần nghiền phong cách, ví dụ từ bỏ int thành long int.

Với đưa định int là 4 byte, long int là 8 byte, ví như dùng little endian, khi xay hình dạng, tương tác bộ nhớ lưu trữ không cần thiết phải chuyển đổi, chúng ta chỉ việc ghi tiếp các byte to hơn mà thôi.

Nhưng nếu như cũng trường phù hợp kia, mà áp dụng big endian, thì bọn họ vẫn đề nghị dịch cửa hàng bộ lưu trữ hiện nay thêm 4 byte nữa mới bao gồm không gian để tàng trữ.

Nhưng big endian cũng có thể có mà lại ưu thế một mực, với Việc hiểu dữ liệu byte lớn số 1 trước, nó sẽ khá dễ dãi kiểm tra một số trong những là âm xuất xắc dương, vày byte đựng vết được hiểu đầu tiên.

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

#include /* function lớn 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 lớn Call 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, giả dụ trang bị của công ty là little endian thì hiệu quả vẫn là

67 45 23 01còn ví như lắp thêm bạn là big endian thì 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 của chúng ta là little endian giỏi big endian tuyệt không? Có vô vàn những biện pháp khác nhau, dưới đây 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 trên, c là nhỏ trỏ, nó trỏ mang đến vùng nhớ của biến i là một số trong những nguyên ổn. Bởi bởi vì số nguim là hình dáng dữ liệu các byte, trong khí dữ liệu của char chỉ là một byte nhưng mà thôi, nên *c sẽ trả về quý hiếm là byte đầu tiên của số nguyên i.

Xem thêm: Tiểu Sử Nguyễn Hà Đông - Tiểu Sử Nhà Thiết Kế Game Nguyễn Hà Đông

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

Vấn đề này tác động vậy nào đến việc lập trình

Về cơ phiên bản thì little endian hay big endian không có ảnh hưởng lắm tới việc lập trình sẵn. Phần lớn các xây dựng viên ko nên quyên tâm nhiều lắm, bởi vì những việc đã làm được những trình biên dịch/thông dich đảm nhiệm không còn.

Tuy nhiên, một số ngôi trường hợp, chúng ta buộc phải quyên tâm, đặc biệt Khi chuyển đổi dữ liệu giữa những máy vi tính không giống nhau. Ví dụ: Khi họ đề xuất xử trí một tệp tin bao gồm kết cấu nuốm này, 4 byte thứ nhất là một số nguyên n, tiếp đến là n số nguyên ổn, từng số chiếm phần 4 byte bộ lưu trữ, v.v...

Trong trường đúng theo này, Lúc dấn tệp tin được tạo nên từ 1 máy tính xách tay khác, bài toán nó được ghi theo phong cách little endian tuyệt big endian cụ thể là tác động hết sức cực kỳ nghiêm trọng, nếu thực hiện sai cách thức, bọn họ vẫn tiếp thu tài liệu sai.

Một trường vừa lòng không giống nữa rất có thể xảy ra vấn đề là khi bọn họ ép hình trạ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 trên, chúng ta đã xay thứ hạng một array hai bộ phận char thành một số nguyên 2 byte (short int). Trong ví dụ này, little endian tuyệt big endian cũng có ảnh hưởng không hề nhỏ.

Một laptop dùng little endian sẽ sở hữu được tác dụng là một trong những lúc big endian đang cho công dụng là 256. Để rời hầu hết lỗi đáng tiếc có thể xẩy ra, đầy đủ code nhỏng bên trên cần được tránh.

Vấn đề NUXI

NUXI là 1 sự việc khôn xiết danh tiếng tương quan mang đến 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 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ố nguyên ổn dạng short int: UN cùng IX.

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

Với bất kể tài liệu nào thì cũng vậy, chúng ta luôn luôn nhận được tài liệu đúng nếu như đọc với ghi vào và một khối hệ thống. Thế dẫu vậy, hãy để mắt tới kỹ rộng về Việc thu xếp những byte vào bộ lưu trữ.

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

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

N U X IMặc cho dù trông hơi ngược nhưng khối hệ thống little endian đang cách xử lý việc đọc góp chúng ta, đề xuất lưu trữ những điều đó tuy vậy Lúc mang ra chúng ta vẫn có dữ liệu ban sơ. Thế tuy vậy Khi bọn họ ghi tài liệu này ra file, gửi sang một máy tính không giống. Và từng máy tính xách tay lại cách xử lý theo cách riêng rẽ của nó thì UNIX bên trên thiết bị big endian sẽ được hiểu là NUXI bên trên thiết bị little endian (và ngược lại).

Đây chính là vấn gần như nguy nan nhất khi họ trao đỏi dữ liệu qua lại thân những laptop cùng nhau, quan trọng vào thời đại Internet thời buổi này.

Trao thay đổi tài liệu giữa các thiết bị bao gồm endian khác nhau

Ngày nay, đông đảo máy tính xách tay đa số được kết nối nhằm dàn xếp dữ liệu với nhau. Little endian giỏi big endian cũng đầy đủ yêu cầu Bàn bạc cùng nhau, tuy thế làm cho thế làm sao để sở hữu phát âm được nhau Lúc bọn chúng ko nói thông thường một máy tiếng?

Có 2 giải pháp chủ yếu mang lại Việc này

Sử dụng chung định dạng

Một phương pháp đơn giản và dễ dàng duy nhất toàn bộ thực hiện chung một định dang khi truyền tài liệu.

ví dụ như mọi tập tin dạng PNG mọi cần phải sử dụng big endian. Tương trường đoản cú với những tập tin có cấu tạo không giống. Đó là lý do bởi vì sao chúng ta nhiều khi rất cần được sử dụng đông đảo ứng dụng chuyên được dùng nhằm phát âm cùng ghi các file này.

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

Và khi đó bọn họ cần có một chuẩn tầm thường. Hiện nay, chuẩn bình 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ế tuy nhiên, dù đã chuẩn chỉnh bình thường rồi, thỉnh thoảng vẫn đang còn gần như giao thức đùa chội hơn, áp dụng little endian.

Để hoàn toàn có thể thay đổi tài liệu thành dữ liệu chuẩn theo network byte order, công tác đề nghị Hotline hàm hton* (host-to-network) (trong ngôn từ C). Trong khối hệ thống big endian, hàm này sẽ không đề xuất làm gì cả, còn little endian sẽ tiến hành chuyển đối các byte một chút ít.

Dù hệ thống big endian không buộc phải thay đổi dữ liệu, Việc call hàm này vẫn luôn là rất cần thiết. Chương thơm trình của bạn có thể được viết bởi một ngôn từ (C) cơ mà có thể được dịch cùng thực thi sinh sống nhiều hệ thống khác biệt, Việc Call hàm này sẽ giúp họ làm cho điều đó.

Tương tự, sinh sống chiều trở lại, bọn họ buộc phải hotline hàm ntoh* nhằm chuyển đổi dữ liệu nhận được từ bỏ mạng về dữ liệu máy tính xách tay hoàn toàn có thể đọc được. Ngoài ra, chúng ta còn nên hiểu rõ giao diện tài liệu mà lại chúng ta cần đổi khác nữa, danh sách những hàm đổi khác như sau:

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

Những hàm này cực kỳ đặc biệt lúc thực hiện chia đã tài liệu ở tầng rẻ, ví dụ lúc đánh giá checksum của những gói tin ví dụ điển hình. Nếu ko làm rõ về little endian với big endian thì Lúc đề nghị thao tác về mạng, các bạn sẽ gặp những khó khăn.

Sử dụng BOM (Byte Order Mark)

Một cách thực hiện khác để giải quyết và xử lý sự khác biệt về endian là thực hiện BOM (Byte Order Mark). Đây là 1 trong ký kết tự đặc trưng, có mức giá trị là 0xFEFF, được ghi tại đoạn trước tiên của tệp tin.

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

Xem thêm: Nsnd Thu Quế: Người Cổ Lỗ Sĩ Nhất Làng Diễn Viên Thu Quế, Ngỡ Ngàng Nhan Sắc Tuổi 52 Của Nsnd Thu Quế

Thđọng nhị, BOM ko trọn vẹn thần thánh, bởi nó phụ thuộc vào vào lập trình viên. Có người có trọng điểm thì đọc và giải pháp xử lý Khi gặp gỡ BOM, gồm người thì trọn vẹn chẳng chú ý nó với coi nói như tài liệu thường thì. Unicode áp dụng BOM Khi lưu trữ dữ liệu nhiều byte (các cam kết tự Unicode được mã hoá thành 2, 3 thậm chí là 4 byte).