ENDIAN LÀ GÌ

Bài viết gốc: https://manhhomienbienthuy.bitbucket.io/2018/Sep/20/little-endian-vs-big-endian.html (sẽ xin phxay tác giả

*

)

Little endian cùng big endian, đó là hai phương thức khác nhau nhằm lưu trữ tài liệu dạng nhị phân (binary). Bình thường thì chúng ta cũng chẳng cần quan tâm mang đến bọn chúng làm những gì. Bởi rất nhiều vấn đề sẽ tiến hành auto hoá hết.Quý khách hàng đang xem: Big endian là gì

Thế nhưng lại có những trường hợp, ví dụ Lúc yêu cầu xử trí các tập tin gồm cấu tạo, tập tin binary, độc nhất vô nhị là phần lớn tập tin được ghi bằng ngôn từ khác, thì câu hỏi phát âm về little endian và big endian là vô cùng quan trọng đặc biệt. Bởi nếu không, rất có thể họ vẫn hiểu không đúng thiết bị trường đoản cú cùng cách xử trí cùng với dữ liệu được đọc không nên.

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

Dữ liệu

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

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

Thực ra vấn đề đó chỉ đúng cùng với laptop số (digital electronic computer). Nghe nói bây giờ máy tính xách tay lượng tử, máy vi tính sinh học tập cũng đang được phát triển, hy vọng trong vài năm tới, họ vẫn update lại kỹ năng và kiến thức về dữ liệu.

Thực ra, máy tính không hiểu biết nhiều được những cam kết từ 0, 1 trong những hệ nhị phân đâu, nó chuyển động theo các biểu lộ điện tử. Mô tả đúng mực thì khôn xiết nặng nề, tuy nhiên bạn có thể hiểu "sơ sơ" rằng, gặp mặt bit 1 thì sẽ sở hữu được dòng diện, gặp gỡ bit 0 thì không tồn tại. Vậy nên, những bit 0, 1 được xử trí thành các dấu hiệu điện tử tương xứng, cùng bọn họ coi kia như máy vi tính sẽ đọc được dữ liệu nhị phân.

Thế tuy thế, mặc dù cùng 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 ngữ. Cũng y hệt như coi tín đồ vậy, khi quan sát các cam kết từ a, b, c có fan đọc, gồm bạn ko. Máy tính Khi chú ý vào những biểu đạt tương xứng cùng với các cam kết hiệu 0 hay như là một, từng máy vi tính hoàn toàn có thể phát âm theo một cách khác biệt.

Thế tuy nhiên, rất may là các máy tính xách tay vẫn hoạt động theo số đông tiêu chuẩn bình thường, vậy nên nó vẫn hoàn toàn có thể tiếp xúc cùng nhau được. Tuy nhiên, lưu ý rằng, không hẳn bất cứ dịp như thế nào, những máy tính xách tay cũng có thể đọc được lẫn nhau.

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

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

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

07 5b cd 15Đã tất cả lúc nào, chúng ta 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 làm sao không. Quý khách hàng cho rằng, nó sẽ tiến hành ghi theo thứ tự theo thứ trường đoản cú nhưng chúng ta đang hiểu với viết sống trên, thì chúng ta đang nhầm.

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

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

Little endian với big endian là nhị cách tiến hành khác nhau nhằm tàng trữ tài liệu. Sự khác biệt của little endian với big endian Khi tàng trữ chính là nghỉ ngơi Việc thu xếp sản phẩm từ bỏ những byte tài liệu.

Trong phương pháp tàng trữ little endian (bắt đầu từ "little-end" nghĩa chấm dứt bé dại hơn), byte ở đầu cuối vào màn trình diễn nhị phân bên trên sẽ tiến hành 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 ít đúng không? Big endian (khởi đầu từ "big-end") thì ngược lại, là vẻ ngoài ghi dữ liệu theo sản phẩm công nghệ từ bình thường nhưng chúng ta vẫn sử dụng. 123456789 được tàng trữ vẫn theo như đúng đồ vật trường đoản cú là

07 5b cd 15Các thuật ngữ big-kết thúc tuyệt little-end xuất phát từ cuốn tiểu ttiết Gulliver du ký kết (Gulliver"s Travels), trong các số ấy nhân đồ Lilliputans tranh luận về việc yêu cầu đập trứng bằng đầu khổng lồ tốt nhỏ tuổi.

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

Thêm một lưu ý nữa rằng, little endian xuất xắc big endian chỉ khác hoàn toàn Khi đề nghị lưu trữ rất nhiều dữ liệu có không ít byte. Những tài liệu chỉ có 1 byte (ví dụ ký tự ASCII) thì không tác động gì (chính xác là cho dù cần sử dụng cách làm như thế nào công dụng tương tự như nhau)

Little endian và big endian được dùng bên trên đa số máy tính nào?

Việc thu xếp những byte tài liệu theo kiểu little endian xuất xắc big endian không chỉ là xẩy ra khi bọn họ tàng trữ dữ liệu ra bộ nhớ lưu trữ ko kể. Mọi hoạt động vui chơi của máy tính xách tay hầu hết áp dụng dữ liệu nhị phân, nên little endian/big endian hiện hữu vào hồ hết hoạt động vui chơi của laptop.

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

Các cỗ vi xử trí Intel đông đảo thực hiện little endian, những cỗ vi xử trí cả ARM trước đó cũng là little endian, cơ mà hiện tại này ARM sẽ tăng cấp vi cách xử lý của bản thân thành bi-endian (tức là giải pháp xử lý cả little endian và big endian).

Các cỗ vi xử trí PowerPC với SPARK trước đó phần đa là big endian, tuy vậy hiện thời chúng cũng được nâng cấp thành bi-endian.

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

Little endian tuyệt big endian cũng giống như bàn cãi gốc về bài toán đập trứng, không tồn tại một cách làm làm sao thực thụ xuất sắc hơn cách thức nào.

Little endian giỏi big endian chỉ khác nhau sống vấn đề lưu trữ sản phẩm công nghệ tự các byte dữ liệu. Cả hai phương thức đông đảo không làm cho tác động mang đến vận tốc cách xử lý của CPU. Thế phải cả hai thủ tục đông đảo vẫn sống thọ song song và sẽ không bao giờ hoàn toàn có thể gồm một câu vấn đáp thoả đáng: Phương thơm thức làm sao thì xuất sắc hơn?

Mỗi thủ tục đều sở hữu đầy đủ ưu thế cố định. Với little endian, bởi byte bé dại tốt nhất luôn nằm bên cạnh trái, nó vẫn được cho phép bọn họ phát âm dữ liệu cùng với độ lâu năm tuỳ ý. Nó sẽ tương đối thích hợp trường hợp họ phải nghiền dạng hình, ví dụ từ int thành long int.

Với trả định int là 4 byte, long int là 8 byte, trường hợp dùng little endian, Khi ép hình trạng, shop bộ nhớ không nhất thiết phải chuyển đổi, bọn họ chỉ việc ghi tiếp những byte lớn hơn mà thôi.

Nhưng ví như cũng ngôi trường vừa lòng đó, mà lại sử dụng big endian, thì bọn họ vẫn yêu cầu dịch can dự bộ nhớ hiện giờ thêm 4 byte nữa mới có không gian nhằm tàng trữ.

Nhưng big endian cũng có thể có tuy thế điểm mạnh nhất định, cùng với việc phát âm tài liệu byte lớn nhất trước, nó sẽ khá dễ dàng kiểm soát một vài là âm hay dương, vày byte chứa dấu được hiểu thứ nhất.

Xem những byte dữ liệu vào cỗ nhớ

#include /* function khổng lồ 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 Hotline above function for 0x01234567 */intmain () int i = 0x01234567; show_mem_rep ((char *) &i, sizeof (i)); return 0;khi thực thi lịch trình bên trên, nếu lắp thêm của người tiêu dùng là little endian thì tác dụng đang là

67 45 23 01còn nếu như sản phẩm công nghệ bạn là big endian thì nó đã hiển thị theo sản phẩm công nghệ từ thông thường

01 23 45 67Có bí quyết như thế nào để xác định máy tính của bọn họ là little endian tuyệt big endian xuất xắc không? Có rất nhiều những bí quyết khác nhau, bên dưới đây là một trong số 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 dễ dàng trên, c là nhỏ trỏ, nó trỏ mang lại vùng nhớ của trở nên i là một vài nguyên ổn. Bởi vì số nguyên ổn là phong cách dữ liệu những byte, trong khí dữ liệu của char chỉ là một trong byte mà lại thôi, yêu cầu *c đang trả về giá trị là byte thứ nhất của số nguyên i.

Xem thêm: Viết Chữ Kiểu Trên Giấy - Bộ Sưu Tập 108 Ảnh Mẫu Chữ Kiểu Đẹp

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

Điều này tác động ráng làm sao đến việc lập trình

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

Tuy nhiên, một số ngôi trường thích hợp, chúng ta đề nghị quan tâm, quan trọng đặc biệt Lúc đổi khác dữ liệu giữa các máy vi tính không giống nhau. Ví dụ: lúc chúng ta đề nghị xử trí một file có kết cấu nỗ lực này, 4 byte thứ nhất là một số nguyên n, sau đó là n số nguim, từng số chiếm 4 byte bộ lưu trữ, v.v...

Trong ngôi trường hòa hợp này, lúc dấn tệp tin được tạo ra từ 1 máy tính khác, bài toán nó được ghi theo phong cách little endian xuất xắc big endian ví dụ là tác động hết sức nghiêm trọng, trường hợp áp dụng không đúng cách làm, chúng ta đang đuc rút dữ liệu sai.

Một ngôi trường thích hợp khác nữa rất có thể xẩy ra sự việc là lúc họ xay đẳng cấp cho những 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ọ đang xay kiểu dá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 có ảnh hưởng rất cao.

Một máy tính cần sử dụng little endian sẽ sở hữu được hiệu quả là một trong những lúc big endian đang đến 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, phần lớn code như bên trên rất cần được tránh.

Vấn đề NUXI

NUXI là 1 vấn đề khôn cùng lừng danh tương quan mang lại little endian với big endian: UNIX được lưu lại trong một hệ thống big-endian sẽ tiến hành gọi là NUXI trong một hệ thống little endian.

Giả sử họ đề xuất tàng trữ 4 byte (U, N, I, X) bởi hai số ngulặng dạng short int: UN cùng IX.

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

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

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

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

N U X IMặc dù trông khá ngược cơ mà khối hệ thống little endian vẫn giải pháp xử lý câu hỏi gọi giúp họ, cần tàng trữ như vậy nhưng lúc lấy ra bọn họ vẫn có dữ liệu thuở đầu. Thế cơ mà khi bọn họ ghi tài liệu này ra tệp tin, gửi sang 1 máy tính xách tay khác. Và từng máy tính xách tay lại xử trí theo cách riêng rẽ của nó thì UNIX trên sản phẩm big endian sẽ tiến hành đọc là NUXI trên máy little endian (và ngược lại).

Đây chính là vấn hầu hết gian nguy nhất lúc bọn họ trao đỏi tài liệu tương hỗ giữa các máy tính xách tay cùng nhau, đặc biệt 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 đồ vật tất cả endian khác nhau

Ngày nay, số đông máy tính xách tay đông đảo được liên kết nhằm dàn xếp tài liệu cùng nhau. Little endian giỏi big endian cũng mọi bắt buộc trao đổi cùng nhau, mà lại làm cho cụ nào để sở hữu đọc được nhau Lúc bọn chúng không nói chung một thiết bị tiếng?

Có 2 phương án bao gồm mang lại việc này

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

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

lấy một ví dụ mọi tập tin dạng PNG hầu hết sẽ phải áp dụng big endian. Tương từ cùng với các tập tin gồm cấu trúc khác. Đó là nguyên do vì chưng sao chúng ta thỉnh thoảng rất cần phải cần sử dụng đa số phần mềm chuyên dụng để phát âm cùng ghi các tệp tin này.

Thế nhưng lại trong kết nối cùng với Internet, câu hỏi truyền dữ liệu còn phức hợp hơn thế nữa. Chúng ta chẳng thể cứ đọng dùng một định dạng tệp tin nào đó, rồi truyền từng byte một sang trọng máy không giống được. Muốn nắn tăng tốc độ, cần chúng ta đề nghị truyền những byte một dịp.

Và lúc ấy chúng ta cần phải có một chuẩn tầm thường. Lúc bấy giờ, chuẩn tầm thường cho vấn đề truyền dữ liệu trên mạng, điện thoại tư vấn là network byte order đó là big endian. Thế nhưng mà, cho dù đang chuẩn bình thường rồi, thỉnh thoảng vẫn có số đông giao thức chơi chội rộng, thực hiện little endian.

Để rất có thể biến đổi tài liệu thành dữ liệu chuẩn chỉnh theo network byte order, lịch trình bắt buộc hotline hàm hton* (host-to-network) (vào ngôn từ C). Trong hệ thống big endian, hàm này không buộc phải làm cái gi cả, còn little endian sẽ triển khai gửi đối những byte một chút ít.

Dù khối hệ thống big endian không đề xuất biến đổi dữ liệu, bài toán Hotline hàm này vẫn là rất quan trọng. Chương trình của chúng ta có thể được viết bởi một ngôn từ (C) dẫu vậy hoàn toàn có thể được dịch cùng tiến hành sống nhiều khối hệ thống khác biệt, bài toán Hotline hàm này sẽ giúp chúng ta làm điều đó.

Tương từ, sinh hoạt chiều ngược lại, họ phải Hotline hàm ntoh* nhằm chuyển đổi tài liệu nhận ra tự mạng về dữ liệu laptop hoàn toàn có thể phát âm được. Trong khi, bọn họ còn bắt buộc làm rõ hình dạng tài liệu mà chúng ta bắt buộc biến hóa nữa, danh sách các hàm biến hóa nlỗi sau:

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

Những hàm này hết sức quan trọng lúc triển khai phân tách đang dữ liệu ở tầng rẻ, ví dụ khi chất vấn checksum của các gói tin ví dụ điển hình. Nếu không hiểu rõ về little endian cùng big endian thì lúc yêu cầu làm việc về mạng, bạn sẽ gặp mặt các khó khăn.

Sử dụng BOM (Byte Order Mark)

Một phương án khác để giải quyết và xử lý sự biệt lập về endian là sử dụng BOM (Byte Order Mark). Đây là một trong những ký tự đặc biệt, có giá trị là 0xFEFF, được ghi ở chỗ thứ nhất của file.

Nếu bạn đọc cam kết từ bỏ này là 0xFFFE (bị ngược) thì có nghĩa tệp tin này được ghi với endian khác với khối hệ thống của công ty, khi đó, bạn sẽ rất cần được đổi khác phương thức đọc tài liệu một chút ít.

Có một vài vấn đề nhỏ dại cùng với câu hỏi áp dụng BOM. Thđọng độc nhất, BOM sẽ gây ra tăng tài liệu được ghi vào file. Ngay cả lúc bọn họ chỉ gửi đi 2 byte tài liệu, chúng ta vẫn nên thêm 2 byte BOM nữa.

Thứ đọng nhì, BOM ko trọn vẹn thần thánh, bởi vì nó nhờ vào vào xây dựng viên. Có người có tâm thì gọi và cách xử lý lúc gặp mặt BOM, bao gồm bạn thì hoàn toàn xem nhẹ nó và coi nói nlỗi tài liệu thường thì. Unicode sử dụng BOM khi tàng trữ dữ liệu nhiều byte (những ký kết từ Unicode được mã hoá thành 2, 3 thậm chí là 4 byte).