Little Endian Là Gì

*
)

Little endian và big endian, đấy là hai phương thức khác biệt để tàng trữ dữ liệu dạng nhị phân (binary). Bình thường thì bọn họ cũng chẳng cần cân nhắc chúng làm cho gì. Bởi vì mọi việc sẽ được tự động hoá hết.

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

Thế nhưng có những tình huống, lấy ví dụ khi cần xử lý các tập tin gồm cấu trúc, tập tin binary, tuyệt nhất là phần đông tập tin được ghi bằng ngôn ngữ khác, thì việc hiểu về little endian cùng big endian là hết sức quan trọng. Bởi nếu không, rất tất cả thể chúng ta sẽ hiểu sai sản phẩm tự và cách xử trí với dữ liệu được đọc sai.

Dữ liệu

Dữ liệu là mô tả của tin tức dưới dạng tàng trữ được. Tin tức là vật dụng trừu tượng, không có hình dạng, đó là hồ hết hiểu biết về các sự vật, vụ việc xung quanh chúng ta. Để lưu lại trữ, cũng tương tự truyền đạt tin tức đến rất nhiều người, họ cần đến dữ liệu. Dữ liệu có thể là chữ viết, hình hình ảnh được ghi bên trên giấy, vớ cả bọn họ dữ liệu mà nhỏ người rất có thể hiểu được.

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

Thực ra vấn đề đó chỉ đúng với laptop số (digital electronic computer). Nghe nói hiện nay máy tính lượng tử, máy vi tính sinh học tập cũng đang rất được phát triển, mong muốn trong vài năm tới, bọn họ sẽ update lại kiến thức về dữ liệu.

Thực ra, thứ tính không hiểu biết nhiều được các ký trường đoản cú 0, một trong các hệ nhị phân đâu, nó vận động theo những tín hiệu năng lượng điện tử. Mô tả đúng đắn thì rất khó, nhưng chúng ta có thể hiểu "sơ sơ" rằng, gặp bit 1 thì sẽ sở hữu dòng diện, chạm chán bit 0 thì ko có. Như vậy, các bit 0, 1 được xử lý thành những tín hiệu điện tử tương ứng, và chúng ta coi kia như máy tính đã đọc được tài liệu nhị phân.

Thế nhưng, 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ông giống nhau cũng không đích thực nói phổ biến một ngôn ngữ. Cũng như coi fan vậy, lúc nhìn những ký trường đoản cú a, b, c có bạn hiểu, có người không. Laptop khi chú ý vào những tín hiệu khớp ứng với các ký hiệu 0 tuyệt 1, mỗi lắp thêm tính rất có thể hiểu theo một cách khác nhau.

Thế nhưng, hết sức may là các máy tính xách tay vẫn chuyển động theo rất nhiều tiêu chuẩn chung, thế cho nên nó vẫn có thể giao tiếp cùng nhau được. Tuy nhiên, để ý rằng, không phải bất cứ lúc nào, các máy tính xách tay cũng rất có thể hiểu được lẫn nhau.

Trong trang bị tính, các dữ liệu nhị phân không được giải pháp xử lý theo từng bit riêng rẽ lẻ, mà lại được xử trí thành từng khối 8 bit một, và đơn vị chức năng xử lý nhỏ nhất này gọi là byte.

Ví dụ, số nguyên 123456789 được biểu diễn dưới dạng nhị phân đã là (ở đây tôi cho rằng kiểu dữ liệu int sẽ có form size là 4 byte, tuy nhiên, nhiều hệ thống 64 bit vẫn nâng kích cỡ này lên 8 byte)

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

07 5b cd 15Đã bao gồm bao giờ, chúng ta tự hỏi, lúc ghi tài liệu này trên đĩa cứng chẳng hạn, nó được ghi thế nào chưa. Bạn cho rằng, nó sẽ được ghi theo thứ tự theo thiết bị tự mà họ đang đọc với viết ở trên, thì chúng ta đã nhầm.

Đây là phương pháp viết theo phong cách số Ả rập cho họ dễ phát âm thôi, máy vi tính không "đọc" các ký tự như là như bọn họ nên nó cũng không tàng trữ giống cách bọn họ viết các ký từ này ra đâu. Câu hỏi ghi dữ liệu như vậy nào đó 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ì phương thức khác nhau để tàng trữ dữ liệu. Sự khác biệt của little endian với big endian khi lưu giữ trữ chính là ở việc sắp xếp thứ tự các byte dữ liệu.

Trong cơ chế tàng trữ little endian (xuất phát từ "little-end" nghĩa kết thúc nhỏ tuổi hơn), byte sau cùng trong trình diễn nhị phân trên sẽ được ghi trước. Lấy ví dụ 123456789 ghi theo phong cách little endian sẽ thành

15 cd 5b 07Hơi ngược một chút ít đúng không? Big endian (xuất phạt từ "big-end") thì ngược lại, là chế độ ghi dữ liệu theo máy tự bình thường mà họ vẫn dùng. 123456789 được lưu trữ vẫn theo đúng thứ từ bỏ là

07 5b cd 15Các thuật ngữ big-end tuyệt little-end xuất phát từ cuốn tè thuyết Gulliver du ký (Gulliver"s Travels), trong các số ấy nhân đồ Lilliputans tranh cãi về việc nên đập trứng bằng đầu to hay nhỏ.

Và ngành IT đã vận dụng thuật ngữ ngày, tương đối giống cùng với nghĩa gốc. Xem xét rằng, little endian giỏi big endian chỉ khác biệt ở bí quyết sắp xếp các byte dữ liệu, còn đồ vật tự từng bit vào byte thì như là nhau. Siêu may, các máy tính xách tay vẫn gồm điểm trung này.

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

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

Việc sắp đến xếp các byte tài liệu theo hình trạng little endian tốt big endian không chỉ có xảy ra khi chúng ta lưu trữ tài liệu ra bộ lưu trữ ngoài. Mọi hoạt động của máy tính đều sử dụng dữ liệu nhị phân, bắt buộc little endian/big endian tồn tại trong mọi hoạt động vui chơi của máy tính.

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

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

Các cỗ vi cách xử trí PowerPC và SPARK trước đó đều là big endian, nhưng hiện giờ chúng cũng khá được nâng cấp cho thành bi-endian.

Các có tác dụng nào thì xuất sắc hơn: little endian tuyệt big endian?

Little endian hay big endian cũng như tranh luận cội về vấn đề đập trứng, không có một thủ tục nào thực sự tốt hơn cách làm nào.

Little endian giỏi big endian chỉ không giống nhau ở việc lưu trữ thứ tự những byte dữ liệu. Cả nhị phương thức những không làm tác động đến vận tốc xử lý của CPU. Thế nên cả hai phương thức mọi vẫn tồn tại song song với sẽ không lúc nào có thể tất cả một câu trả lời thoả đáng: cách làm nào thì xuất sắc hơn?

Mỗi phương thức đều có những điểm mạnh nhất định. Cùng với little endian, vì chưng byte nhỏ nhất luôn nằm bên trái, nó sẽ cho phép chúng ta đọc tài liệu với độ lâu năm tuỳ ý. Nó đang rất thích hợp nếu chúng ta cần ép kiểu, lấy một ví dụ từ int thành long int.

Với giả định int là 4 byte, long int là 8 byte, nếu dùng little endian, khi ép kiểu, showroom bộ nhớ không nhất thiết phải thay đổi, bọn họ chỉ buộc phải ghi tiếp các byte to hơn mà thôi.

Nhưng nếu cũng trường hợp đó, mà sử dụng big endian, thì bọn họ sẽ nên dịch địa chỉ bộ nhớ bây giờ thêm 4 byte nữa mới có không khí để giữ trữ.

Nhưng big endian cũng có nhưng ưu thế nhất định, với việc đọc tài liệu byte lớn số 1 trước, nó đã rất thuận lợi kiểm tra một số trong những là âm hay dương, bởi byte chứa dấu được hiểu đầu tiên.

Xem các byte tài liệu trong cỗ nhớ

Chương trình C dễ dàng nhau cho chúng ta cách chú ý về việc sắp xếp các byte trong bộ nhớ.

Xem thêm: Các Tần Số Kênh Bóng Đá Tv Cab, Các Tần Số Phát Sóng Dvb T2

#include /* function khổng lồ 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 gọi above function for 0x01234567 */intmain () int i = 0x01234567; show_mem_rep ((char *) &i, sizeof (i)); return 0;Khi xúc tiến chương trình trên, ví như máy của chúng ta là little endian thì kết quả sẽ là

67 45 23 01còn nếu như máy chúng ta là big endian thì nó sẽ hiển thị theo lắp thêm tự thông thường

01 23 45 67Có biện pháp nào để xác minh máy tính của chúng ta là little endian hay big endian tốt không? bao gồm vô số các cách khác nhau, dưới đấy là một trong số những giải pháp đó:

#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 và đơn giản trên, c là nhỏ trỏ, nó trỏ mang lại vùng nhớ của đổi mới i là một số trong những nguyên. Cũng chính vì số nguyên là kiểu dữ liệu nhiều byte, trong khí dữ liệu của char chỉ là 1 trong những byte nhưng thôi, yêu cầu *c sẽ trả về quý hiếm là byte thứ nhất của số nguyên i.

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

Điều này tác động thế nào tới việc lập trình

Về cơ bạn dạng thì little endian tốt big endian ko có ảnh hưởng lắm đến việc lập trình. Phần nhiều các lập trình viên ko cần nhiệt tình nhiều lắm, bởi vì mọi vấn đề đã được các trình biên dịch/thông dich phụ trách hết.

Tuy nhiên, một số trong những trường hợp, họ cần quan tâm, đặc biệt khi đổi khác dữ liệu giữa các máy tính xách tay khác nhau. Ví dụ: khi bọn họ cần xử lý một tệp tin có cấu tạo thế này, 4 byte thứ nhất là một số trong những nguyên n, tiếp đến là n số nguyên, mỗi số chỉ chiếm 4 byte cỗ nhớ, v.v...

Trong trường hòa hợp này, khi nhấn file được tạo ra từ một máy vi tính khác, việc nó được ghi theo kiểu little endian giỏi big endian ví dụ là ảnh hưởng rất nghiêm trọng, nếu áp dụng sai phương thức, họ sẽ thu về tài liệu sai.

Một trường hợp khác nữa có thể xảy ra sự việc là khi chúng ta ép kiểu 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, bọn họ đã ép dạng hình một array hai phần tử char thành một số trong những nguyên 2 byte (short int). Trong lấy ví dụ này, little endian xuất xắc big endian cũng có tác động rất lớn.

Một máy tính xách tay dùng little endian đã có công dụng là 1 trong khi big endian sẽ cho hiệu quả là 256. Để tránh phần đông lỗi đáng tiếc hoàn toàn có thể xảy ra, hồ hết code như trên rất cần được tránh.

Vấn đề NUXI

NUXI là 1 vấn đề rất lừng danh liên quan cho little endian và big endian: UNIX được lưu trong một khối hệ thống big-endian sẽ tiến hành hiểu là NUXI trong một khối hệ thống little endian.

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

#include intmain () short int *s; // pointer to set 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 khổng lồ next location *s = "IX"; // store second short: I * 256 + X return 0;Đoạn code trên trả toàn hòa bình với hệ thống, bất kể nó là little xuất xắc big endian. Nếu bọn họ lưu trữ những giá trị "UN" và "IX" khi phát âm ra, nó vẫn đã là "UNIX" hay không? ví như mọi bài toán chỉ xảy ra trên một sản phẩm công nghệ tính, mặc dù là big endian xuất xắc little endian thì nó sẽ luôn là như vậy, vày mọi thứ sẽ được tự động hóa hoá giúp chúng ta.

Với bất kể dữ liệu nào thì cũng vậy, họ luôn thu được tài liệu đúng giả dụ đọc với ghi trong cùng một hệ thống. Cụ nhưng, hãy lưu ý kỹ rộng về việc sắp xếp các byte trong bộ nhớ.

Một khối hệ thống big endian sẽ lưu trữ như sau:

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

N U X IMặc cho dù trông hơi ngược nhưng khối hệ thống little endian sẽ xử lý việc đọc giúp chúng ta, nên tàng trữ như vậy nhưng mà khi rước ra bọn họ vẫn có tài liệu ban đầu. Tuy nhiên khi chúng ta ghi tài liệu này ra file, chuyển sang một laptop khác. Cùng mỗi máy tính lại xử lý theo cách riêng của nó thì UNIX trên thiết bị big endian sẽ được hiểu là NUXI trên thiết bị little endian (và ngược lại).

Đây chính là vấn đều nguy khốn nhất khi bọn họ trao đỏi dữ liệu qua lại giữa các máy tính với nhau, quan trọng đặc biệt trong thời đại internet ngày nay.

Trao đổi dữ liệu giữa các máy gồm endian khác nhau

Ngày nay, mọi laptop đều được kết nối để trao đổi tài liệu với nhau. Little endian giỏi big endian cũng rất nhiều phải thảo luận với nhau, mà lại làm nỗ lực nào để có hiểu được nhau khi chúng không nói chung một vật dụng tiếng?

Có 2 chiến thuật chính cho bài toán này

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

Một phương án đơn giản nhất toàn bộ sử dụng tầm thường một định dang khi truyền dữ liệu.

Ví dụ đa số tập tin dạng PNG đều cần phải sử dụng big endian. Tương tự như với những tập tin có cấu trúc khác. Đó là vì sao vì sao bọn họ nhiều khi rất cần được dùng những phần mềm chuyên được sự dụng để đọc và ghi các file này.

Thế nhưng mà trong liên kết với Internet, bài toán truyền tài liệu còn phức hợp hơn thế. Họ không thể cứ cần sử dụng một format file như thế nào đó, rồi truyền từng byte một sang thiết bị khác được. ý muốn tăng tốc độ, bắt buộc bọn họ phải truyền những byte một lúc.

Và lúc đó chúng ta cần gồm một chuẩn chỉnh chung. Hiện tại nay, chuẩn chỉnh chung cho vấn đề truyền tài liệu trên mạng, hotline là network byte order đó là big endian. Cố gắng nhưng, dù đã chuẩn chung rồi, thỉnh thoảng vẫn đang còn những giao thức nghịch chội hơn, sử dụng little endian.

Để tất cả thể đổi khác dữ liệu thành dữ liệu chuẩn theo network byte order, chương trình phải gọi hàm hton* (host-to-network) (trong ngôn từ C). Trong hệ thống big endian, hàm này không cần làm những gì cả, còn little endian sẽ triển khai chuyển đối những byte một chút.

Dù hệ thống big endian không cần biến hóa dữ liệu, câu hỏi gọi hàm này vẫn luôn là rất buộc phải thiết. Công tác của chúng ta có thể được viết bởi một ngôn từ (C) nhưng hoàn toàn có thể được dịch và xúc tiến ở nhiều hệ thống khác nhau, việc gọi hàm này sẽ giúp họ làm điều đó.

Tương tự, sinh hoạt chiều ngược lại, chúng ta cần điện thoại tư vấn hàm ntoh* để biến hóa dữ liệu nhận thấy từ mạng về tài liệu máy tính hoàn toàn có thể hiểu được. Bên cạnh ra, họ còn phải nắm rõ kiểu dữ liệu mà bọn họ cần biến hóa nữa, danh sách những hàm thay đổi như sau:

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

Những hàm này vô cùng đặc biệt khi thực hiện chia đã dữ liệu ở tầng thấp, lấy ví dụ như khi soát sổ checksum của các gói tin chẳng hạn. Giả dụ không làm rõ về little endian cùng big endian thì khi cần làm việc về mạng, bạn sẽ gặp những khó khăn.

Sử dụng BOM (Byte Order Mark)

Một phương án khác để xử lý sự biệt lập về endian là áp dụng BOM (Byte Order Mark). Đây là 1 trong những ký tự sệt biệt, có mức giá trị là 0xFEFF, được ghi ở vị trí đầu tiên của file.

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

Có một vài vấn đề nhỏ tuổi với việc áp dụng BOM. đồ vật nhất, BOM sẽ gây ra tăng tài liệu được ghi vào file. Ngay cả khi chúng ta chỉ gởi đi 2 byte dữ liệu, chúng ta vẫn cần thêm 2 byte BOM nữa.

Thứ hai, BOM không hoàn toàn thần thánh, bởi nó phụ nằm trong vào thiết kế viên. Có người có tâm thì đọc và cách xử trí khi gặp BOM, có tín đồ thì hoàn toàn bỏ quên nó và coi nói như tài liệu thông thường. Unicode áp dụng BOM khi lưu trữ dữ liệu các byte (nhiều ký kết tự Unicode được mã hoá thành 2, 3 thậm chí là 4 byte).