Bài viết gốc: https://manhhomienbienthuy.bitbucket.io/2018/Sep/20/little-endian-vs-big-endian.html (vẫn xin phnghiền tác giả


*

)

Little endian với big endian, đây là nhị thủ tục khác nhau nhằm lưu trữ tài liệu dạng nhị phân (binary). Bình thường thì bọn họ cũng chẳng đề nghị quyên tâm mang đến bọn chúng làm cái gi. Bởi hầu như câu hỏi sẽ tiến hành auto hoá không còn.Quý khách hàng đang xem: Endian là gì

Thế cơ mà có những tình huống, ví dụ lúc cần cách xử lý những tập tin có cấu trúc, tập tin binary, tốt nhất là phần nhiều tập tin được ghi bởi ngữ điệu không giống, thì câu hỏi đọc về little endian với big endian là khôn xiết đặc biệt. Bởi nếu như không, hết sức rất có thể chúng ta sẽ đọc sai vật dụng tự cùng cách xử lý với tài liệu được hiểu sai.Quý Khách sẽ xem: Endian là gì

Dữ liệu

Dữ liệu là biểu lộ của ban bố bên dưới dạng lưu trữ được. Thông tin là sản phẩm trừu tượng, không có hình dạng, đó là đông đảo đọc biết về các sự trang bị, sự việc xung quanh họ. Để lưu trữ, cũng tương tự truyền đạt biết tin mang đến phần đa người, bọn họ buộc phải mang lại dữ liệu. Dữ liệu hoàn toàn có thể là chữ viết, hình hình ảnh được ghi trên chứng từ, toàn bộ họ dữ liệu mà nhỏ tín đồ có thể hiểu được.

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

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

Thực ra điều này chỉ đúng cùng với máy tính số (digital electronic computer). Nghe nói bây chừ laptop lượng tử, máy vi tính sinh học cũng đang rất được trở nên tân tiến, mong muốn vào vài năm cho tới, bọn họ đã update lại kỹ năng và kiến thức về dữ liệu.

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

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

Thế dẫu vậy, siêu may là các laptop vẫn vận động theo hầu như tiêu chuẩn chỉnh tầm thường, vậy nên nó vẫn hoàn toàn có thể tiếp xúc với nhau được. Tuy nhiên, để ý rằng, chưa phải bất cứ cơ hội làm sao, những laptop cũng rất có thể hiểu được lẫn nhau.

Trong máy tính, các tài liệu nhị phân ko được xử trí theo từng bit trơ trọi, mà lại được giải pháp xử lý thành từng khối 8 bit một, với đơn vị chức năng xử lý nhỏ dại tuyệt nhất này hotline là byte.

lấy ví dụ, số ngulặng 123456789 được màn biểu diễn bên dưới dạng nhị phân vẫn là (ở đây tôi nhận định rằng phong cách tài liệu int sẽ có được 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, bạn cũng có thể viết nó bên dưới dạng hexa như 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 chẳng hạn, nó được ghi thế làm sao không. Quý Khách nhận định rằng, nó sẽ tiến hành ghi thứu tự theo máy trường đoản cú cơ mà chúng ta vẫn phát âm với viết ở trên, thì bạn đang nhầm.

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

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

Little endian với big endian là nhị cách làm khác nhau nhằm lưu trữ dữ liệu. Sự biệt lập của little endian và big endian lúc lưu trữ chính là ngơi nghỉ vấn đề bố trí vật dụng trường đoản cú các byte tài liệu.

Trong qui định tàng trữ little endian (bắt đầu từ "little-end" nghĩa hoàn thành nhỏ tuổi hơn), byte ở đầu cuối trong màn trình diễn nhị phân trên sẽ được ghi trước. Ví dụ 123456789 ghi theo phong cách little endian sẽ thành

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

07 5b cd 15Các thuật ngữ big-end hay little-kết thúc khởi nguồn từ cuốn tiểu thuyết Gulliver du ký (Gulliver"s Travels), trong các số ấy nhân trang bị Lilliputans bàn cãi về bài toán đề nghị đập trứng bằng đầu to giỏi nhỏ tuổi.

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

Thêm một để ý nữa rằng, little endian xuất xắc big endian chỉ khác biệt Lúc buộc phải lưu trữ các dữ liệu có tương đối nhiều byte. Những tài liệu chỉ có 1 byte (ví dụ ký kết từ bỏ ASCII) thì ko tác động gì (và đúng là cho dù sử dụng cách làm làm sao tác dụng cũng như nhau)

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

Việc sắp xếp những byte dữ liệu theo kiểu little endian hay big endian không chỉ xẩy ra lúc chúng ta tàng trữ dữ liệu ra bộ nhớ lưu trữ ko kể. Mọi hoạt động của máy tính xách tay rất nhiều sử dụng tài liệu nhị phân, bắt buộc little endian/big endian tồn tại trong đều hoạt động vui chơi của máy tính xách tay.

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

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

Các bộ vi xử lý PowerPC cùng SPARK trước đó đầy đủ là big endian, nhưng mà hiện thời bọn chúng cũng rất được tăng cấp thành bi-endian.

Các làm cho làm sao thì giỏi hơn: little endian hay big endian?

Little endian xuất xắc big endian tương tự như tranh biện gốc về việc đập trứng, không có một cách tiến hành như thế nào đích thực giỏi rộng cách làm nào.

Little endian xuất xắc big endian chỉ khác nhau ở việc lưu trữ thứ từ bỏ các byte tài liệu. Cả nhì cách tiến hành đông đảo ko làm ảnh hưởng mang đến tốc độ cách xử lý của CPU. Thế đề xuất cả hai thủ tục đều vẫn mãi mãi tuy vậy tuy vậy và sẽ không còn bao giờ rất có thể tất cả 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 cách làm đều phải sở hữu số đông ưu thế một mực. Với little endian, bởi vì byte nhỏ tuyệt nhất luôn luôn nằm cạnh trái, nó đang chất nhận được chúng ta đọc tài liệu với độ dài tuỳ ý. Nó sẽ tương đối phù hợp nếu chúng ta nên ép hình dáng, ví dụ từ int thành long int.

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

Nhưng trường hợp cũng ngôi trường phù hợp đó, nhưng áp dụng big endian, thì chúng ta đã yêu cầu dịch liên hệ bộ lưu trữ hiện nay thêm 4 byte nữa new bao gồm không khí để tàng trữ.

Nhưng big endian cũng đều có nhưng mà ưu thế một mực, với Việc gọi dữ liệu byte lớn nhất trước, nó sẽ khá thuận lợi bình chọn một số trong những là âm giỏi dương, bởi byte đựng vết được phát âm trước tiên.

Xem thêm: Tên Thật Của Miss Fortune Tốc Chiến, Top Sự Thật Thú Vị Về Miss Fortune

Xem các byte tài liệu vào bộ nhớ

#include /* function khổng lồ show bytes in memory, from location start to 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 khổng lồ Gọi above sầu function for 0x01234567 */intmain () int i = 0x01234567; show_mem_rep ((char *) &i, sizeof (i)); return 0;lúc xúc tiến công tác trên, nếu như sản phẩm của bạn là little endian thì kết quả sẽ là

67 45 23 01còn giả dụ đồ vật chúng ta là big endian thì nó đang hiển thị theo thứ trường đoản cú thông thường

01 23 45 67Có bí quyết làm sao nhằm xác định máy tính xách tay của họ là little endian tốt big endian giỏi không? Có rất nhiều các giải pháp khác biệt, dưới đấy là một trong các các phương pháp đó:

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

Như vậy tác động ráng như thế nào tới việc lập trình

Về cơ phiên bản thì little endian tuyệt big endian không tồn tại tác động lắm tới việc lập trình. Phần mập các thiết kế viên không buộc phải quyên tâm những lắm, vày mọi bài toán đã được các trình biên dịch/thông dich phụ trách hết.

Tuy nhiên, một trong những trường vừa lòng, bọn họ đề xuất quan tâm, quan trọng khi thay đổi dữ liệu thân những laptop khác biệt. Ví dụ: khi chúng ta đề nghị giải pháp xử lý một tệp tin gồm cấu trúc ráng này, 4 byte thứ nhất là một số nguyên n, kế tiếp là n số nguyên ổn, từng số chiếm 4 byte bộ nhớ, v.v...

Trong ngôi trường vừa lòng này, lúc nhận file được tạo thành xuất phát từ một máy tính xách tay khác, bài toán nó được ghi theo kiểu little endian tốt big endian ví dụ là ảnh hưởng khôn xiết cực kỳ nghiêm trọng, nếu áp dụng sai cách tiến hành, họ đang thu về tài liệu không đúng.

Một trường thích hợp không giống nữa có thể xảy ra vụ việc là lúc họ nghiền vẻ bên ngoài 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, bọn họ đã xay hình dạng một array nhị phần tử char thành một số trong những nguim 2 byte (short int). Trong ví dụ này, little endian tốt big endian cũng có tác động không hề nhỏ.

Một laptop sử dụng little endian sẽ sở hữu kết quả là 1 trong trong những khi big endian vẫn đến hiệu quả là 256. Để tách phần nhiều lỗi không mong muốn hoàn toàn có thể xẩy ra, đều code nhỏng trên cần phải rời.

Vấn đề NUXI

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

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

#include intmain () short int *s; // pointer to lớn mix 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 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 chủ quyền cùng với khối hệ thống, bất cứ nó là little tuyệt big endian. Nếu họ lưu trữ những cực hiếm "UN" và "IX" khi hiểu ra, nó vẫn sẽ là "UNIX" tuyệt không? Nếu những vấn đề chỉ xảy ra bên trên một laptop, dù là big endian tốt little endian thì nó đã luôn luôn là điều này, do hồ hết lắp thêm sẽ tiến hành tự động hoá gó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 chiếm được tài liệu đúng nếu gọi với ghi trong cùng một khối hệ thống. Thế cơ mà, hãy chú ý kỹ rộng về việc sắp xếp những byte vào bộ nhớ 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ì vẫn nhỏng sau:

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

Đây chính là vấn hầu như nguy nan nhất khi chúng ta trao đỏi dữ liệu qua lại giữa các máy vi tính với nhau, quan trọng đặc biệt vào thời đại Intengày nay.

Trao đổi dữ liệu giữa các sản phẩm công nghệ bao gồm endian không giống nhau

Ngày nay, hồ hết laptop hầu hết được liên kết nhằm dàn xếp dữ liệu cùng nhau. Little endian tốt big endian cũng các phải thương lượng với nhau, mà lại làm cho cố kỉnh nào để sở hữu gọi được nhau lúc chúng không nói chung một đồ vật tiếng?

Có 2 phương án bao gồm đến Việc này

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

Một giải pháp dễ dàng tốt nhất tất cả áp dụng thông thường một định dang khi truyền dữ liệu.

ví dụ như các tập tin dạng PNG đông đảo cần phải áp dụng big endian. Tương từ cùng với những tập tin tất cả kết cấu khác. Đó là nguyên nhân bởi sao họ đôi lúc rất cần phải dùng phần đa ứng dụng chuyên được sự dụng để đọc cùng ghi những tệp tin này.

Thế dẫu vậy vào kết nối với Internet, vấn đề truyền dữ liệu còn tinh vi hơn thế. Chúng ta tất yêu cứ đọng cần 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 quý phái vật dụng không giống được. Muốn nắn tăng tốc độ, buộc phải họ nên truyền các byte một thời gian.

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

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

Dù khối hệ thống big endian ko buộc phải chuyển đổi tài liệu, việc call hàm này vẫn là hết sức 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ôn ngữ (C) nhưng mà có thể được dịch với xúc tiến nghỉ ngơi các khối hệ thống khác nhau, câu hỏi Call hàm này sẽ giúp đỡ chúng ta làm điều này.

Tương trường đoản cú, ngơi nghỉ chiều ngược lại, chúng ta yêu cầu Hotline hàm ntoh* nhằm chuyển đổi tài liệu nhận được tự mạng về tài liệu máy tính hoàn toàn có thể đọc được. Bên cạnh đó, họ còn bắt buộc nắm rõ vẻ bên ngoài dữ liệu nhưng mà họ nên đổi khác nữa, danh sách các hàm chuyển đổi như sau:

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

Những hàm này cực kỳ quan trọng khi triển khai phân chia vẫn dữ liệu tại tầng thấp, ví dụ Khi soát sổ checksum của các gói tin ví dụ điển hình. Nếu không làm rõ về little endian với big endian thì khi đề nghị thao tác 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 nhằm 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ý kết từ bỏ đặc biệt quan trọng, có giá trị là 0xFEFF, được ghi ở vị trí trước tiên của file.

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 viên. Có người có trọng tâm thì phát âm và giải pháp xử lý khi gặp BOM, có bạn thì hoàn toàn bỏ quên nó và coi nói nlỗi tài liệu thường thì. Unicode thực hiện BOM lúc lưu trữ tài liệu những byte (nhiều ký kết từ Unicode được mã hoá thành 2, 3 thậm chí còn là 4 byte).

Bài viết liên quan

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *