Endian là gì

*
)

Little endian và big endian, đây là nhị cách tiến hành khác biệt nhằm lưu trữ dữ liệu dạng nhị phân (binary). Bình thường thì họ cũng chẳng phải quyên tâm cho bọn chúng làm gì. Bởi hầu hết bài toán sẽ tiến hành auto hoá hết.

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

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

Dữ liệu

Dữ liệu là trình bày của báo cáo dưới dạng tàng trữ được. tin tức là thứ trừu tượng, không có kiểu dáng, chính là số đông hiểu biết về những sự đồ gia dụng, vụ việc bao phủ bọn họ. Để tàng trữ, cũng giống như truyền đạt công bố mang đến hầu như fan, bọn họ cần đến dữ liệu. Dữ liệu rất có thể là chữ viết, hình hình họa được ghi trên chứng từ, toàn bộ chúng ta dữ liệu nhưng mà nhỏ tín đồ có thể gọi được.

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

Thực ra điều đó chỉ đúng cùng với máy tính xách tay số (digital electronic computer). Nghe nói bây chừ máy tính xách tay lượng tử, máy tính xách tay 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 năm tới, họ vẫn update lại kiến thức và kỹ năng về dữ liệu.

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

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

Thế nhưng, rất may là các máy vi tính vẫn chuyển động theo đông đảo tiêu chuẩn chỉnh thông thường, thế cho nên nó vẫn có thể giao tiếp cùng nhau được. Tuy nhiên, để ý rằng, chưa phải bất cứ cơ hội như thế nào, những máy vi tính cũng hoàn toàn có thể hiểu được lẫn nhau.

Trong máy vi tính, các tài liệu nhị phân ko được giải pháp xử lý theo từng bit đơn côi, nhưng mà được xử lý thành từng khối hận 8 bit một, với đơn vị xử lý nhỏ dại độc nhất vô nhị này call là byte.

ví dụ như, số nguyên ổn 123456789 được trình diễn dưới dạng nhị phân đang là (ở chỗ này tôi nhận định rằng phong cách dữ liệu int sẽ có được form size là 4 byte, tuy nhiên, những khối hệ thống 64 bit đang nâng kích cỡ này lên 8 byte)

00000111 01011011 11001101 00010101Để nthêm gọn gàng, chúng ta có thể viết nó dưới dạng hexa nlỗi sau:

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

Đây là giải pháp viết theo phong cách số Ả rập cho bọn họ dễ hiểu thôi, laptop không "đọc" các ký từ y như chúng ta vì thế nó cũng ko lưu trữ như là biện pháp chúng ta viết những ký kết tự này ra đâu. Việc ghi dữ liệu như thế nào chính là thời điểm little endian và big endian được sử dụng đến.

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

Little endian với big endian là nhì cách làm khác nhau nhằm tàng trữ dữ liệu. Sự khác biệt của little endian cùng big endian Lúc tàng trữ chính là làm việc việc bố trí vật dụng từ bỏ những byte dữ liệu.

Trong phép tắc lưu trữ little endian (bắt nguồn từ "little-end" nghĩa xong xuôi bé dại hơn), byte ở đầu cuối trong biểu diễn nhị phân trên sẽ được ghi trước. lấy ví dụ như 123456789 ghi theo kiểu little endian đang thành

15 cd 5b 07Hơi ngược một chút đúng không? Big endian (xuất phát từ "big-end") thì ngược trở lại, là vẻ ngoài ghi dữ liệu theo sản phẩm công nghệ tự bình thường cơ mà chúng ta vẫn cần sử dụng. 123456789 được tàng trữ vẫn theo đúng đồ vật từ bỏ là

07 5b cd 15Các thuật ngữ big-kết thúc tốt little-over khởi đầu từ cuốn tiểu thuyết Gulliver du cam kết (Gulliver"s Travels), trong các số ấy nhân thứ Lilliputans tranh luận về bài toán phải đập trứng bằng đầu lớn hay nhỏ tuổi.

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

Thêm một chú ý nữa rằng, little endian hay big endian chỉ biệt lập lúc bắt buộc lưu trữ đầy đủ dữ liệu có nhiều byte. Những tài liệu chỉ có một byte (ví dụ cam kết trường đoản cú ASCII) thì ko tác động gì (chính xác là cho dù cần 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 đều máy tính nào?

Việc sắp xếp các byte tài liệu theo phong cách little endian hay big endian không chỉ có xảy ra khi bọn họ lưu trữ tài liệu ra bộ nhớ lưu trữ bên cạnh. Mọi hoạt động của máy tính phần nhiều thực hiện dữ liệu nhị phân, đề xuất little endian/big endian hiện hữu trong gần như hoạt động vui chơi của máy tính.

Ngoài bài toán áp dụng little endian/big endian 1 phần nhờ vào vào ứng dụng (vì lập trình sẵn viên cố gắng ý thực hiện một trong nhị nhiều loại, hoặc ngữ điệu lập trình sẵn cách thức trước), nó còn dựa vào vào cỗ vi giải pháp xử lý của bao gồm máy vi tính kia.

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

Các cỗ vi cách xử trí PowerPC và SPARK trước đó những là big endian, nhưng lại hiện thời chúng cũng khá đượ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 xuất xắc big endian?

Little endian hay big endian tương tự như tranh luận gốc về câu hỏi đập trứng, không tồn tại một cách làm nào thực thụ giỏi hơn thủ tục nào.

Little endian xuất xắc big endian chỉ khác biệt làm việc bài toán lưu trữ thứ tự các byte tài liệu. Cả nhị cách làm đông đảo ko làm tác động mang đến tốc độ xử lý của CPU. Thế yêu cầu cả nhì cách tiến hành phần đa vẫn mãi sau song tuy vậy với sẽ không còn bao giờ hoàn toàn có thể tất cả một câu vấn đáp thoả đáng: Phương thơm thức nào thì giỏi hơn?

Mỗi thủ tục đều phải có phần đông điểm mạnh nhất thiết. Với little endian, vì chưng byte nhỏ dại tốt nhất luôn nằm sát trái, nó đã cho phép họ đọc tài liệu cùng với độ dài tuỳ ý. Nó sẽ khá phù hợp giả dụ họ cần nghiền phong cách, ví dụ trường đoản cú int thành long int.

Với trả định int là 4 byte, long int là 8 byte, nếu như sử dụng little endian, Khi nghiền dạng hình, ảnh hưởng bộ lưu trữ không cần thiết phải biến hóa, chúng ta chỉ cần ghi tiếp các byte to hơn nhưng thôi.

Nhưng nếu cũng ngôi trường đúng theo kia, nhưng mà thực hiện big endian, thì chúng ta đã yêu cầu dịch tác động bộ nhớ hiện nay thêm 4 byte nữa mới tất cả không gian nhằm lưu trữ.

Nhưng big endian cũng có tuy thế lợi thế khăng khăng, cùng với việc đọc tài liệu byte lớn nhất trước, nó sẽ tương đối dễ dãi kiểm soát một trong những là âm tốt dương, vị byte đựng lốt được hiểu thứ nhất.

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

Chương thơm trình C đơn giản nhau đến chúng ta cách nhìn về câu hỏi sắp xếp những byte trong bộ nhớ.

Xem thêm: Cách Chỉnh Kích Thước Ô Trong Excel 2010, 2013, 2016, 2019 Đơn Giản

#include /* function to 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 to Gọi above sầu function for 0x01234567 */intmain () int i = 0x01234567; show_mem_rep ((char *) &i, sizeof (i)); return 0;Khi xúc tiến công tác bên trên, trường hợp lắp thêm của người sử dụng là little endian thì công dụng đang là

67 45 23 01còn trường hợp vật dụng các bạn là big endian thì nó vẫn hiển thị theo thứ tự thông thường

01 23 45 67Có biện pháp như thế nào để xác định máy vi tính của họ là little endian hay big endian tuyệt không? Có vô vàn các giải pháp khác biệt, dưới đây là một trong các 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 trên, c là con trỏ, nó trỏ mang lại vùng ghi nhớ của trở nên i là một vài nguim. Bởi vì chưng số ngulặng là giao diện tài liệu các byte, vào khí dữ liệu của char chỉ là 1 trong byte nhưng mà thôi, phải *c sẽ trả về cực hiếm là byte đầu tiên của số nguim i.

Nếu máy vi tính của chúng ta là little endian thì byte trước tiên này sẽ là 1 trong những, ngược trở lại thì nó vẫn là 0.

Điều này ảnh hưởng gắng như thế nào đến việc lập trình

Về cơ phiên bản thì little endian tốt big endian không có ảnh hưởng lắm đến sự việc lập trình sẵn. Phần mập các thiết kế viên ko đề nghị quyên tâm những lắm, do số đông Việc đã đượ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, họ cần quan tâm, đặc biệt quan trọng lúc biến hóa dữ liệu thân những máy tính xách tay khác biệt. Ví dụ: Lúc chúng ta đề xuất xử trí một tệp tin bao gồm kết cấu thế này, 4 byte thứ nhất là một số nguyên n, tiếp nối là n số nguyên, mỗi số chiếm phần 4 byte bộ nhớ, v.v...

Trong ngôi trường thích hợp này, Khi dìm tệp tin được tạo nên từ một máy tính không giống, việc nó được ghi theo phong cách little endian hay big endian ví dụ là tác động khôn xiết cực kỳ nghiêm trọng, giả dụ áp dụng không đúng cách tiến hành, chúng ta đang đuc rút dữ liệu không đúng.

Một trường đúng theo khác nữa có thể xẩy ra sự việc là lúc bọn họ xay 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 bên trên, bọn họ sẽ nghiền giao diện một array hai bộ phận char thành một số trong những nguim 2 byte (short int). Trong ví dụ này, little endian hay big endian cũng có tác động rất to lớn.

Một máy tính cần sử dụng little endian sẽ sở hữu được hiệu quả là 1 trong khi big endian đã cho tác dụng là 256. Để tránh các lỗi không mong muốn hoàn toàn có thể xảy ra, số đông code nlỗi bên trên cần được tránh.

Vấn đề NUXI

NUXI là 1 trong những vụ việc siêu danh tiếng liên quan cho little endian và big endian: UNIX được lưu giữ trong một hệ thống big-endian sẽ được đọc 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ởi nhị số nguim dạng short int: UN và IX.

#include intmain () short int *s; // pointer khổng lồ set 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 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 độc lập cùng với hệ thống, bất cứ nó là little hay big endian. Nếu họ lưu trữ các quý hiếm "UN" và "IX" Khi đọc ra, nó vẫn sẽ là "UNIX" tuyệt không? Nếu phần lớn bài toán chỉ xẩy ra bên trên một máy vi tính, dù cho là big endian hay little endian thì nó sẽ luôn là như thế, vày gần như sản phẩm công nghệ sẽ tiến hành tự động hóa hoá góp họ.

Với bất cứ tài liệu nào cũng vậy, họ luôn luôn thu được tài liệu đúng ví như gọi cùng ghi trong và một hệ thống. Thế mà lại, hãy cẩn thận kỹ rộng về vấn đề bố trí các byte trong bộ nhớ.

Một hệ thống big endian đang tàng trữ như sau:

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

N U X IMặc cho dù trông khá ngược tuy thế hệ thống little endian đang cách xử lý Việc hiểu góp họ, bắt buộc tàng trữ điều này cơ mà lúc lôi ra chúng ta vẫn có dữ liệu lúc đầu. Thế mà lại Khi bọn họ ghi dữ liệu này ra tệp tin, gửi sang một máy tính khác. Và từng máy tính lại giải pháp xử lý theo cách riêng biệt của nó thì UNIX trên vật dụng big endian sẽ tiến hành phát âm là NUXI trên vật dụng little endian (và ngược lại).

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

Trao đổi tài liệu giữa những máy có endian khác nhau

Ngày ni, đa số máy vi tính phần nhiều được liên kết nhằm đàm phán tài liệu cùng nhau. Little endian tuyệt big endian cũng phần nhiều đề xuất trao đổi cùng nhau, nhưng làm cho núm làm sao để có gọi được nhau lúc bọn chúng không nói chung một vật dụng tiếng?

Có 2 chiến thuật bao gồm đến bài toán này

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

Một phương pháp đơn giản dễ dàng độc nhất tất cả sử dụng bình thường một định dang Khi truyền tài liệu.

lấy ví dụ như đa số tập tin dạng PNG đa số bắt buộc phải sử dụng big endian. Tương tự cùng với những tập tin gồm kết cấu không giống. Đó là lý do vì sao bọn họ nhiều khi rất cần được cần sử dụng phần lớn phần mềm chuyên được sự dụng nhằm hiểu cùng ghi những tệp tin 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 tạp hơn thế. Chúng ta quan yếu cứ sử dụng một định dạng tệp tin như thế nào kia, rồi truyền từng byte một sang lắp thêm khác được. Muốn tăng tốc độ, bắt buộc bọn họ đề nghị truyền những byte một thời gian.

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

Để có thể biến đổ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 ngữ C). Trong hệ thống big endian, hàm này sẽ không đề nghị làm gì cả, còn little endian đang thực hiện chuyển đối những byte một chút ít.

Dù khối hệ thống big endian không cần đổi khác dữ liệu, việc hotline hàm này vẫn luôn là hết sức cần thiết. Chương trình của chúng ta có thể được viết bằng một ngữ điệu (C) tuy vậy hoàn toàn có thể được dịch với triển khai ở các hệ thống khác nhau, Việc Call hàm này sẽ giúp chúng ta làm điều ấy.

Tương tự, sinh hoạt chiều ngược chở lại, bọn họ phải Gọi hàm ntoh* để đổi khác dữ liệu cảm nhận từ bỏ mạng về tài liệu máy tính hoàn toàn có thể phát âm được. Bên cạnh đó, họ còn bắt buộc hiểu rõ vẻ bên ngoài dữ liệu nhưng họ bắt buộc chuyển đổi nữa, list các hàm biến đổi nlỗi sau:

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

Những hàm này cực kỳ đặc biệt quan trọng Lúc tiến hành chia vẫn tài liệu ở tầng thấp, ví dụ lúc bình chọn checksum của các gói tin ví dụ điển hình. Nếu không nắm rõ về little endian cùng big endian thì lúc đề xuất làm việc về mạng, các bạn sẽ gặp nhiều trở ngại.

Sử dụng BOM (Byte Order Mark)

Một phương án không giống để giải quyết sự biệt lập về endian là sử dụng BOM (Byte Order Mark). Đây là 1 trong ký tự quan trọng, có giá trị là 0xFEFF, được ghi ở chỗ đầu tiên của tệp tin.

Nếu bạn đọc ký kết tự này là 0xFFFE (bị ngược) thì bao gồm nghĩa file này được ghi cùng 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ẽ cần được biến hóa thủ tục hiểu dữ liệu một ít.

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

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