HomeĐời SốngEndian là gì

Endian là gì

03:02, 29/03/2021

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


*

)

Little endian và big endian, đó là nhì thủ tục khác biệt nhằm lưu trữ tài liệu dạng nhị phân (binary). Bình thường xuyên thì bọn họ cũng chẳng cần quan tâm mang lại chúng làm cái gi. Bởi số đông bài toán sẽ được auto hoá hết.quý khách hàng đã xem: Endian là gì

Thế tuy vậy bao gồm trường hợp, ví dụ khi yêu cầu giải pháp xử lý những tập tin có cấu trúc, tập tin binary, độc nhất là hầu hết tập tin được ghi bằng ngữ điệu không giống, thì vấn đề hiểu về little endian và big endian là siêu đặc biệt quan trọng. Bởi còn nếu không, khôn xiết hoàn toàn có thể bọn họ đang phát âm sai sản phẩm công nghệ từ bỏ cùng cách xử lý với dữ liệu được hiểu sai.

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

Dữ liệu

Dữ liệu là thể hiện của báo cáo dưới dạng tàng trữ được. Thông tin là lắp thêm trừu tượng, không tồn tại làm nên, đó là số đông phát âm biết về các sự đồ vật, vấn đề bao bọc bọn họ. Để lưu trữ, cũng giống như truyền đạt biết tin mang đến phần đông người, bọn họ yêu cầu đến 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ờ, toàn bộ bọn họ tài liệu nhưng mà con tín đồ có thể đọc được.

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

Thực ra vấn đề này chỉ đúng với máy vi tính số (digital electronic computer). Nghe nói hiện giờ máy tính xách tay lượng tử, máy tính sinc học cũng đang được cách tân và phát triển, hi vọng vào vài ba năm cho tới, chúng ta vẫn update lại kỹ năng và kiến thức về tài liệu.

Thực ra, máy tính thiếu hiểu biết được những cam kết tự 0, 1 trong các hệ nhị phân đâu, nó chuyển động theo các dấu hiệu điện tử. Mô tả chính xác thì cực kỳ khó khăn, nhưng bạn có thể đọc "sơ sơ" rằng, chạm mặt bit 1 thì sẽ sở hữu được mẫu diện, chạm chán bit 0 thì không tồn tại. bởi vậy, những bit 0, 1 được giải pháp xử lý thành các bộc lộ điện tử tương xứng, và họ coi đó nhỏng máy tính xách tay đã đọc được tài liệu nhị phân.

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

Thế mà lại, khôn xiết may là các laptop vẫn hoạt động theo đa số tiêu chuẩn chỉnh bình thường, thế cho nên nó vẫn có thể giao tiếp với nhau được. Tuy nhiên, để ý rằng, chưa hẳn bất cứ cơ hội như thế nào, các laptop cũng rất có thể đọc được lẫn nhau.

Trong máy tính, những tài liệu nhị phân ko được xử trí theo từng bit đơn chiếc, nhưng được xử lý thành từng khối hận 8 bit một, cùng đơn vị chức năng giải pháp xử lý bé dại duy nhất này call là byte.

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

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

07 5b cd 15Đã gồm lúc nào, bạn từ hỏi, lúc ghi dữ liệu này bên trên đĩa cứng chẳng hạn, nó được ghi cầm làm sao không. quý khách hàng cho rằng, nó sẽ tiến hành ghi theo lần lượt theo trang bị từ nhưng mà bọn họ đã đọc cùng viết sinh hoạt trên, thì các bạn sẽ nhầm.

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

Little endian cùng big endian là gì?

Little endian cùng big endian là nhị cách thức không giống nhau nhằm tàng trữ tài liệu. Sự khác biệt của little endian cùng big endian Lúc tàng trữ đó là sinh hoạt vấn đề bố trí vật dụng từ bỏ các byte dữ liệu.

Trong cơ chế tàng trữ little endian (khởi nguồn từ "little-end" nghĩa dứt nhỏ dại hơn), byte sau cuối vào màn biểu diễn nhị phân trên sẽ được ghi trước. Ví dụ 123456789 ghi theo kiểu little endian vẫn thành

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

07 5b cd 15Các thuật ngữ big-kết thúc tốt little-end khởi nguồn từ cuốn nắn đái ttiết Gulliver du cam kết (Gulliver"s Travels), trong những số ấy nhân đồ dùng Lilliputans tranh biện về bài toán buộc phải đập trứng bởi đầu to lớn giỏi nhỏ tuổi.

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

Thêm một chú ý nữa rằng, little endian tuyệt big endian chỉ biệt lập lúc đề nghị lưu trữ phần đa tài liệu có tương đối nhiều byte. Những dữ liệu chỉ có 1 byte (ví dụ cam kết trường đoản cú ASCII) thì ko ảnh hưởng gì (chính xác là mặc dù sử dụng cách làm như thế nào tác dụng cũng như nhau)

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

Việc sắp xếp những byte dữ liệu theo phong cách little endian giỏi big endian không chỉ xảy ra Lúc chúng ta lưu trữ dữ liệu ra bộ lưu trữ xung quanh. Mọi hoạt động của máy tính xách tay phần đông áp dụng dữ liệu nhị phân, phải little endian/big endian hiện hữu trong rất nhiều hoạt động vui chơi của laptop.

Ngoài câu hỏi sử dụng little endian/big endian một trong những phần dựa vào vào phần mềm (vì lập trình viên ráng ý áp dụng 1 trong các hai các loại, hoặc ngữ điệu lập trình dụng cụ trước), nó còn dựa vào vào cỗ vi cách xử lý của bao gồm máy tính đó.

Các bộ vi cách xử lý Intel mọi thực hiện little endian, những bộ vi giải pháp xử lý cả ARM trước đó cũng là little endian, tuy nhiên hiện này ARM đang nâng cấp vi xử lý của mình thành bi-endian (có nghĩa là xử lý cả little endian cùng big endian).

Các cỗ vi xử lý PowerPC với SPARK trước đó phần đa là big endian, dẫu vậy bây giờ bọn chúng cũng được nâng cấp thành bi-endian.

Các làm như thế nào thì xuất sắc hơn: little endian tốt big endian?

Little endian xuất xắc big endian tương tự như bàn cãi gốc về Việc đập trứng, không có một cách làm nào thực sự xuất sắc rộng phương thức nào.

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

Mỗi cách thức đều sở hữu mọi điểm mạnh khăng khăng. Với little endian, bởi vì byte nhỏ tuyệt nhất luôn nằm cạnh sát trái, nó đã chất nhận được họ đọc tài liệu cùng với độ dài tuỳ ý. Nó sẽ rất thích hợp nếu họ cần ép vẻ bên ngoài, ví dụ từ int thành long int.

Với giả định int là 4 byte, long int là 8 byte, nếu như dùng little endian, lúc nghiền hình dáng, thúc đẩy bộ lưu trữ không cần thiết phải đổi khác, bọn họ chỉ cần ghi tiếp những byte to hơn nhưng thôi.

Nhưng trường hợp cũng ngôi trường hợp kia, mà lại áp dụng big endian, thì họ đang đề xuất dịch hệ trọng bộ lưu trữ bây giờ thêm 4 byte nữa mới gồm không gian để tàng trữ.

Nhưng big endian cũng đều có nhưng mà điểm mạnh khăng khăng, với Việc phát âm tài liệu byte lớn số 1 trước, nó sẽ tương đối dễ ợt đánh giá một số trong những là âm tốt dương, bởi byte đựng vết được đọc trước tiên.

Xem các byte tài liệu trong cỗ 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 Hotline above sầu function for 0x01234567 */intmain () int i = 0x01234567; show_mem_rep ((char *) &i, sizeof (i)); return 0;Khi xúc tiến lịch trình trên, nếu sản phẩm công nghệ của người tiêu dùng là little endian thì hiệu quả sẽ là

67 45 23 01còn trường hợp sản phẩm bạn là big endian thì nó sẽ hiển thị theo đồ vật từ bỏ thông thường

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

Xem thêm: Sau Khi Quan Hệ Tình Dục Bao Lâu Thì Có Thai Cho Kết Quả Chính Xác?

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

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

Về cơ bạn dạng thì little endian hay big endian không tồn tại ảnh hưởng lắm tới sự việc lập trình. Phần Khủng các lập trình sẵn viên ko buộc phải quyên tâm nhiều lắm, do phần lớn 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 số trường đúng theo, bọn họ đề nghị quan tâm, đặc trưng lúc thay đổi tài liệu giữa những máy vi tính khác biệt. Ví dụ: Khi bọn họ nên cách xử trí một tệp tin tất cả cấu trúc rứa này, 4 byte trước tiên là một số nguyên ổn n, sau đó là n số ngulặng, từng số chiếm phần 4 byte bộ nhớ lưu trữ, v.v...

Trong ngôi trường thích hợp này, Lúc thừa nhận file được tạo nên xuất phát từ 1 máy vi tính khác, vấn đề nó được ghi theo phong cách little endian tuyệt big endian cụ thể là ảnh hưởng hết sức rất lớn, nếu như thực hiện sai cách tiến hành, chúng ta đang đuc rút dữ liệu không nên.

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

Một máy tính xách tay cần sử dụng little endian sẽ sở hữu công dụng là 1 trong khi big endian vẫn mang đến kết quả là 256. Để tránh phần đông lỗi đáng tiếc rất có thể xảy ra, hầu như code nlỗi trên cần được rời.

Vấn đề NUXI

NUXI là 1 trong vụ việc khôn cùng danh tiếng tương quan cho little endian và big endian: UNIX được giữ trong một khối hệ thống big-endian sẽ được đọc là NUXI vào một hệ thống little endian.

Giả sử bọn họ đề nghị tàng trữ 4 byte (U, N, I, X) bằng nhị số nguyên ổn dạng short int: UN với IX.

#include intmain () short int *s; // pointer to set shorts s = (short int *)malloc(sizeof(short int)); // point lớn 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 trên trọn vẹn chủ quyền với khối hệ thống, bất cứ nó là little hay big endian. Nếu chúng ta tàng trữ các giá trị "UN" với "IX" khi hiểu ra, nó vẫn sẽ là "UNIX" tốt không? Nếu phần nhiều vấn đề chỉ xảy ra trên một máy tính xách tay, mặc dù cho là big endian tốt little endian thì nó đang luôn là như vậy, vì chưng phần nhiều thiết bị sẽ được tự động hóa hoá góp họ.

Với bất cứ dữ liệu nào thì cũng vậy, chúng ta luôn luôn chiếm được tài liệu đúng nếu như hiểu và ghi trong và một khối hệ thống. Thế nhưng lại, hãy lưu ý kỹ hơn về bài toán sắp xếp các byte vào bộ lưu trữ.

Một hệ thống big endian vẫn lưu trữ nlỗi sau:

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

N U X IMặc cho dù trông tương đối ngược nhưng khối hệ thống little endian vẫn xử lý vấn đề hiểu giúp họ, đề nghị tàng trữ như vậy nhưng mà Lúc mang ra bọn họ vẫn đang còn dữ liệu lúc đầu. Thế mà lại lúc bọn họ ghi dữ liệu này ra tệp tin, đưa qua 1 máy tính khác. Và mỗi laptop lại xử trí Theo phong cách riêng của chính nó thì UNIX trên sản phẩm công nghệ big endian sẽ tiến hành hiểu là NUXI trên lắp thêm little endian (và ngược lại).

Đây đó là vấn đều nguy nan nhất lúc họ trao đỏi dữ liệu qua lại giữa các máy tính với nhau, đặc biệt vào thời đại Intethời buổi này.

Trao đổi dữ liệu thân các sản phẩm công nghệ có endian khác nhau

Ngày nay, những máy tính xách tay số đông được kết nối để điều đình tài liệu với nhau. Little endian giỏi big endian cũng phần nhiều đề xuất điều đình cùng nhau, tuy thế làm ráng nào để sở hữu gọi được nhau Khi bọn chúng ko nói thông thường một máy tiếng?

Có 2 phương án chính cho vấn đề này

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

Một phương pháp đơn giản độc nhất tất cả thực hiện thông thường một định dang lúc truyền dữ liệu.

lấy một ví dụ đông đảo tập tin dạng PNG phần nhiều sẽ phải thực hiện big endian. Tương tự với các tập tin gồm cấu tạo khác. Đó là nguyên do vày sao chúng ta nhiều lúc cần phải sử dụng những phần mềm chuyên sử dụng để gọi cùng ghi các file này.

Thế nhưng vào liên kết cùng với Internet, câu hỏi truyền tài liệu còn phức tạp hơn thế nữa. Chúng ta cần yếu 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 trọng thứ khác được. Muốn nắn tăng tốc độ, yêu cầu chúng ta nên truyền những byte một thời điểm.

Và khi đó họ cần có một chuẩn tầm thường. Lúc bấy giờ, chuẩn tầm thường mang lại Việc truyền tài liệu bên trên mạng, Hotline là network byte order chính là big endian. Thế dẫu vậy, mặc dù đã chuẩn chỉnh thông thường rồi, thỉnh thoảng vẫn đang còn hầu hết giao thức nghịch chội hơn, áp dụng little endian.

Để có thể biến đổi dữ liệu thành dữ liệu chuẩn theo network byte order, công tác nên call hàm hton* (host-to-network) (vào ngữ điệu C). Trong hệ thống big endian, hàm này sẽ không phải làm những gì cả, còn little endian vẫn thực hiện đưa đối những byte một ít.

Dù hệ thống big endian không cần đổi khác dữ liệu, việc gọi hàm này vẫn luôn là vô cùng quan trọng. Cmùi hương trình của bạn cũng có thể được viết bởi một ngữ điệu (C) tuy nhiên rất có thể được dịch cùng thực thi sinh hoạt các hệ thống khác nhau, Việc Gọi hàm này để giúp họ làm điều ấy.

Tương từ bỏ, ngơi nghỉ chiều ngược lại, bọn họ nên Hotline hàm ntoh* để biến hóa dữ liệu nhận ra tự mạng về dữ liệu máy tính có thể hiểu được. Hình như, họ còn buộc phải hiểu rõ vẻ bên ngoài tài liệu nhưng mà chúng ta đề nghị biến đổi nữa, danh sách những hàm đổi khác nlỗi sau:

htons - "Host khổng lồ Network Short"htonl- "Host to Network Long"ntohs - "Network to Host Short"ntohl - "Network lớn Host Long"

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

Sử dụng BOM (Byte Order Mark)

Một cách thực hiện không giống để giải quyết và xử lý sự biệt lập về endian là áp dụng BOM (Byte Order Mark). Đây là 1 ký từ bỏ quan trọng, có mức giá trị là 0xFEFF, được ghi ở đoạn thứ nhất của file.

Nếu độc giả cam kết từ này là 0xFFFE (bị ngược) thì có nghĩa tệp tin này được ghi cùng với endian khác với hệ thống của người sử dụng, lúc ấy, các bạn sẽ cần phải chuyển đổi cách làm hiểu tài liệu một ít.

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