Big endian là gì
Bài viết gốc: https://manhhomienbienthuy.bitbucket.io/2018/Sep/20/little-endian-vs-big-endian.html (đã xin phép người sáng tác
)
Little endian với big endian, đây là hai phương thức không giống nhau để tàng trữ dữ liệu dạng nhị phân (binary). Thông thường thì chúng ta cũng chẳng cần xem xét chúng có tác dụng gì. Vì mọi vấn đề sẽ được auto hoá hết.Bạn sẽ xem: Big endian là gì
Thế nhưng bao hàm tình huống, ví dụ như khi buộc phải xử lý những tập tin tất cả cấu trúc, tập tin binary, độc nhất là số đông tập tin được ghi bằng ngôn ngữ khác, thì việc hiểu về little endian với big endian là cực kỳ quan trọng. Vày nếu không, rất có thể chúng ta sẽ đọc sai lắp thêm tự và xử lý với dữ liệu được phát âm sai.Bạn vẫn xem: Big endian là gì
Dữ liệuDữ liệu là biểu thị của tin tức dưới dạng lưu trữ được. Thông tin là đồ vật trừu tượng, không tồn tại hình dạng, kia là phần đông hiểu biết về những sự vật, vấn đề xung quanh bọn chúng ta. Để giữ trữ, cũng giống như truyền đạt tin tức đến những người, chúng ta 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ả họ dữ liệu mà bé người có thể hiểu được.
Bạn đang xem: Big endian là gì
Nhưng những dữ liệu đó rất cần phải được mã hoá một lượt nữa, nếu chúng ta muốn lưu trữ chúng trên máy tính. Như họ đều biết, máy tính chỉ thao tác với tài liệu được mã hoá bên dưới dạng nhị phân, vậy cần mọi dữ liệu rất cần phải mã hoá thành nhị phân mới hoàn toàn có thể xử lý trên máy tính được.
Thực ra vấn đề đó chỉ đúng với máy tính số (digital electronic computer). Nghe nói hiện giờ máy tính lượng tử, laptop sinh học cũng đang được phát triển, hi vọng trong vài năm tới, bọn họ sẽ update lại kỹ năng về dữ liệu.
Thực ra, vật dụng tính không hiểu biết nhiều được các ký trường đoản cú 0, một trong hệ nhị phân đâu, nó chuyển động theo những tín hiệu năng lượng điện tử. Tế bào tả đúng đắn thì khôn cùng khó, nhưng chúng ta cũng có thể hiểu "sơ sơ" rằng, chạm chán bit 1 thì sẽ có dòng diện, gặp mặt bit 0 thì không có. Như vậy, những bit 0, 1 được cách xử lý thành các tín hiệu điện tử tương ứng, và họ coi đó như máy tính đã đọc được dữ liệu nhị phân.
Thế nhưng, tuy vậy cùng sử dụng tín hiệu dạng nhị phân, các máy tính không giống nhau cũng không thực sự nói thông thường một ngôn ngữ. Cũng tương tự coi bạn vậy, lúc nhìn những ký từ a, b, c có tín đồ hiểu, có tín đồ không. Máy vi tính khi quan sát vào những tín hiệu tương xứng với các ký hiệu 0 giỏi 1, mỗi thiết bị tính hoàn toàn có thể hiểu theo một bí quyết khác nhau.
Thế nhưng, hết sức may là các laptop vẫn vận động theo hầu hết tiêu chuẩn chung, vậy cho nên nó vẫn rất có thể giao tiếp với nhau được. Mặc dù nhiên, để ý rằng, ko phải bất kể lúc nào, các máy vi tính cũng rất có thể hiểu được lẫn nhau.
Trong sản phẩm công nghệ tính, những dữ liệu nhị phân ko được cách xử lý theo từng bit riêng biệt lẻ, nhưng được giải pháp xử lý thành từng khối 8 bit một, và đơn vị chức năng xử lý nhỏ dại nhất này điện thoại tư vấn là byte.
Ví dụ, số nguyên 123456789 được màn biểu diễn dưới dạng nhị phân đã là (ở phía trên tôi nhận định rằng kiểu dữ liệu int sẽ có size là 4 byte, mặc dù nhiên, nhiều khối hệ thống 64 bit đã nâng kích cỡ này lên 8 byte)
00000111 01011011 11001101 00010101Để ngắn gọn, bạn có thể viết nó dưới dạng hexa như sau:
07 5b cd 15Đã bao gồm bao giờ, các bạn tự hỏi, khi ghi tài liệu này bên trên đĩa cứng chẳng hạn, nó được ghi cố gắng nào chưa. Bạn cho rằng, nó sẽ được ghi theo thứ tự theo sản phẩm công nghệ tự mà chúng ta đang đọc và viết ở trên, thì bạn đã nhầm.
Đây là giải pháp viết theo kiểu số Ả rập cho họ dễ hiểu thôi, máy vi tính không "đọc" những ký tự giống như bọn họ nên nó cũng không lưu trữ giống cách bọn họ viết các ký tự này ra đâu. Việc ghi dữ liệu như thế nào chính là lúc little endian và big endian được dùng đến.
Little endian và big endian là gì?Little endian với big endian là hai phương thức khác nhau để lưu trữ dữ liệu. Sự biệt lập của little endian và big endian khi lưu giữ trữ chính là ở việc thu xếp thứ tự những byte dữ liệu.
Trong cơ chế tàng trữ little endian (xuất phân 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 một ví dụ 123456789 ghi theo kiểu little endian vẫn thành
15 cd 5b 07Hơi ngược một chút ít đúng không? Big endian (xuất vạc từ "big-end") thì ngược lại, là bề ngoài ghi dữ liệu theo đồ vật tự bình thường mà bọn họ vẫn dùng. 123456789 được lưu trữ vẫn theo như đúng thứ trường đoản cú là
07 5b cd 15Các thuật ngữ big-end tuyệt little-end xuất phát từ cuốn đái thuyết Gulliver du ký (Gulliver"s Travels), trong số đó nhân đồ vật Lilliputans tranh biện về vấn đề nên đập trứng bởi đầu to giỏi nhỏ.
Và ngành IT đã ứng dụng thuật ngữ ngày, kha khá giống cùng với nghĩa gốc. Chú ý rằng, little endian tốt big endian chỉ không giống nhau ở bí quyết sắp xếp các byte dữ liệu, còn máy tự từng bit trong byte thì giống như nhau. Khôn xiết may, các máy vi tính vẫn gồm điểm trung này.
Thêm một lưu ý nữa rằng, little endian tốt big endian chỉ khác hoàn toàn khi cần lưu trữ những dữ liệu có nhiều 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à dù dùng phương thức nào hiệu quả cũng như nhau)
Little endian cùng big endian được dùng trên những máy tính nào?Việc chuẩn bị xếp những byte dữ liệu theo loại little endian tuyệt big endian không chỉ có xảy ra khi họ lưu trữ dữ liệu ra bộ lưu trữ ngoài. Mọi hoạt động của máy tính hồ hết sử dụng tài liệu nhị phân, bắt buộc little endian/big endian tồn tại trong mọi hoạt động của máy tính.
Ngoài việc sử dụng little endian/big endian 1 phần phụ nằm trong vào phần mềm (do lập trình viên cụ ý sử dụng 1 trong những hai loại, hoặc ngữ điệu lập trình phương tiện trước), nó còn phụ thuộc vào vào bộ vi xử trí của chính máy tính đó.
Các bộ vi giải pháp xử lý Intel đều áp dụng little endian, những bộ vi cách xử lý cả ARM trước đó cũng là little endian, nhưng hiện này ARM đã nâng cấp vi xử lý của mình thành bi-endian (tức là xử trí cả little endian và big endian).
Các bộ vi xử lý PowerPC và SPARK trước đây đều là big endian, nhưng hiện nay chúng cũng rất được nâng cung cấp thành bi-endian.
Các có tác dụng nào thì xuất sắc hơn: little endian hay big endian?Little endian tuyệt big endian cũng như tranh luận gốc về câu hỏi đập trứng, không có một thủ tục nào thực sự xuất sắc hơn cách tiến hành nào.
Little endian tuyệt big endian chỉ khác nhau ở việc lưu trữ thứ tự những byte dữ liệu. Cả hai phương thức đều không làm tác động đến vận tốc xử lý của CPU. Vậy cho nên cả nhì phương thức hầu như vẫn tồn tại tuy nhiên song với sẽ không lúc nào có thể bao gồm một câu trả lời thoả đáng: thủ tục nào thì tốt hơn?
Mỗi phương thức đều phải có những điểm mạnh nhất định. Cùng với little endian, do byte bé dại nhất luôn luôn nằm mặt trái, nó sẽ mang lại phép bọn họ đọc dữ liệu với độ nhiều năm tuỳ ý. Nó đã rất thích hợp nếu chúng ta cần xay kiểu, ví dụ như từ int thành long int.
Với trả định int là 4 byte, long int là 8 byte, nếu cần sử dụng little endian, khi nghiền kiểu, địa chỉ bộ nhớ không cần phải thay đổi, họ chỉ nên ghi tiếp các byte to hơn mà thôi.
Nhưng ví như cũng trường phù hợp đó, mà sử dụng big endian, thì họ sẽ buộc phải dịch địa chỉ bộ nhớ bây giờ thêm 4 byte nữa new có không gian để lưu giữ trữ.
Nhưng big endian cũng có thể có nhưng lợi thế nhất định, với câu hỏi đọc dữ liệu byte lớn số 1 trước, nó vẫn rất thuận lợi kiểm tra một số là âm tốt dương, bởi vì byte đựng dấu được gọi đầu tiên.
Xem thêm: Ước Của 1 Số Là Gì - Ước Và Bội Của Một Số Tự Nhiên Là Gì
#include /* function to lớn 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 call above function for 0x01234567 */intmain () int i = 0x01234567; show_mem_rep ((char *) &i, sizeof (i)); return 0;Khi thực thi chương trình trên, nếu như máy của công ty là little endian thì công dụng sẽ là
67 45 23 01còn ví như máy chúng ta là big endian thì nó đã hiển thị theo sản phẩ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 xuất xắc big endian giỏi không? bao gồm vô số những cách khác nhau, dưới đây là một trong số những phương pháp đó:
Nếu máy tính của bọn họ là little endian thì byte thứ nhất này đang là 1, trái lại thì nó sẽ là 0.
Điều này tác động thế nào tới việc lập trìnhVề cơ bản thì little endian hay big endian ko có tác động lắm đến sự việc lập trình. Phần lớn các lập trình viên không cần niềm nở nhiều lắm, vì mọi việc đã được những trình biên dịch/thông dich đảm nhiệm hết.
Tuy nhiên, một số trường hợp, chúng ta cần quan tiền tâm, quan trọng khi thay đổi dữ liệu thân các máy tính xách tay khác nhau. Ví dụ: khi chúng ta cần cách xử trí một file có cấu trúc thế này, 4 byte trước tiên là một số trong những nguyên n, kế tiếp là n số nguyên, từng số chiếm phần 4 byte cỗ nhớ, v.v...
Trong trường thích hợp này, khi thừa nhận file được tạo thành từ một máy tính khác, vấn đề nó được ghi theo phong cách little endian xuất xắc big endian cụ thể là ảnh hưởng rất nghiêm trọng, nếu thực hiện sai phương thức, chúng ta sẽ thu về dữ liệu sai.
Một trường vừa lòng khác nữa hoàn toàn có thể xảy ra vấn đề là khi bọn họ ép kiểu 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 trên, họ đã ép mẫu mã một array hai phần tử char thành một vài 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 dùng little endian đang có tác dụng là 1 trong các khi big endian sẽ cho tác dụng là 256. Để tránh đông đảo lỗi xứng đáng tiếc có thể xảy ra, hầu như code như trên rất cần phải tránh.
Vấn đề NUXINUXI là 1 vấn đề rất danh tiếng liên quan mang lại little endian và big endian: UNIX được lưu lại trong một hệ thống big-endian sẽ được hiểu là NUXI trong một hệ thống little endian.
Giả sử bọn họ cần lưu trữ 4 byte (U, N, I, X) bởi hai số nguyên 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 khổng lồ 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ả toàn chủ quyền với hệ thống, bất kỳ nó là little hay big endian. Nếu chúng ta lưu trữ các giá trị "UN" và "IX" khi gọi ra, nó vẫn vẫn là "UNIX" tuyệt không? nếu mọi vấn đề chỉ xảy ra trên một lắp thêm tính, mặc dù cho là big endian xuất xắc little endian thì nó sẽ luôn luôn là như vậy, vì mọi thứ đang được tự động hoá giúp bọn chúng ta.
Với bất kể dữ liệu nào cũng vậy, chúng ta luôn thu được tài liệu đúng nếu như đọc với ghi trong và một hệ thống. Cầm cố nhưng, hãy chu đáo kỹ hơn về bài toán sắp xếp các byte trong cỗ nhớ.
Một hệ thống big endian sẽ tàng trữ như 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 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 lại khi mang ra chúng ta vẫn có tài liệu ban đầu. Mặc dù vậy khi họ ghi dữ liệu này ra file, đưa sang một máy vi tính khác. Với mỗi máy vi tính lại xử lý theo cách riêng của nó thì UNIX trên vật dụng big endian sẽ tiến hành hiểu là NUXI trên thiết bị little endian (và ngược lại).
Đây chính là vấn đều nguy hại 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, đặc biệt quan trọng trong thời đại mạng internet ngày nay.
Trao đổi dữ liệu giữa những máy tất cả endian không giống nhauNgày nay, mọi máy tính xách tay đều được kết nối để trao đổi tài liệu với nhau. Little endian hay big endian cũng phần đông phải thảo luận với nhau, mà lại làm cố nào để có hiểu được nhau khi bọn chúng không nói chung một trang bị tiếng?
Có 2 phương án chính cho việc này
Sử dụng tầm thường định dạng
Một phương án dễ dàng và đơn giản nhất toàn bộ sử dụng phổ biến một định dang khi truyền dữ liệu.
Ví dụ rất nhiều tập tin dạng PNG đều cần phải sử dụng big endian. Giống như với những tập tin có cấu tạo khác. Đó là tại sao vì sao bọn họ nhiều khi rất cần phải dùng đầy đủ phần mềm chuyên dụng để đọc cùng ghi những file này.
Thế dẫu vậy trong kết nối với Internet, vấn đề truyền dữ liệu còn tinh vi hơn thế. Họ không thể cứ cần sử dụng một format file nào đó, rồi truyền từng byte một sang vật dụng khác được. ước ao tăng tốc độ, bắt buộc chúng ta phải truyền nhiều byte một lúc.
Và lúc đó họ cần gồm một chuẩn chung. Hiện nay, chuẩn chung cho việc truyền tài liệu trên mạng, gọi là network byte order đó là big endian. Thay nhưng, cho dù đã chuẩn chung rồi, thỉnh thoảng vẫn có những giao thức đùa chội hơn, sử dụng little endian.
Để tất cả thể thay đổi dữ liệu thành dữ liệu chuẩn theo network byte order, chương trình đề nghị gọi hàm hton* (host-to-network) (trong ngôn ngữ C). Trong khối 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ù khối hệ thống big endian ko cần biến đổi dữ liệu, việc gọi hàm này vẫn luôn là rất buộc phải thiết. Chương trình của bạn cũng có thể được viết bởi một ngôn ngữ (C) nhưng hoàn toàn có thể được dịch và triển khai ở nhiều hệ thống khác nhau, bài toán gọi hàm này đã giúp chúng ta làm điều đó.
Tương tự, nghỉ ngơi chiều ngược lại, họ cần hotline hàm ntoh* để chuyển đổi dữ liệu cảm nhận từ mạng về dữ liệu máy tính có thể hiểu được. Bên cạnh ra, bọn họ còn phải nắm rõ kiểu tài liệu mà họ cần biến hóa nữa, danh sách các hàm thay đổi như sau:
htons - "Host lớn Network Short"htonl- "Host lớn Network Long"ntohs - "Network lớn Host Short"ntohl - "Network khổng lồ Host Long"Những hàm này vô cùng đặc biệt khi thực hiện chia đã dữ liệu tại tầng thấp, lấy ví dụ khi kiểm soát checksum của những gói tin chẳng hạn. Giả dụ không hiểu rõ về little endian với big endian thì khi cần làm việc về mạng, bạn sẽ gặp nhiều khó khăn.
Sử dụng BOM (Byte Order Mark)
Một phương án khác để giải quyết sự khác hoàn toàn về endian là sử dụng BOM (Byte Order Mark). Đây là một trong ký tự quánh biệt, có mức giá trị là 0xFEFF, được ghi sống vị trí đầu tiên của file.
Xem thêm: Chè Mạn Là Gì? Trà Mạn Là Trà Gì Trà Mạn Là Gì
Thứ hai, BOM không trọn vẹn thần thánh, bởi nó phụ trực thuộc vào xây dựng viên. Có người dân có tâm thì hiểu và cách xử lý khi chạm chán BOM, có tín đồ thì hoàn toàn bỏ quên nó cùng coi nói như dữ liệu thông thường. Unicode thực hiện BOM khi lưu trữ dữ liệu nhiều byte (nhiều ký kết tự Unicode được mã hoá thành 2, 3 thậm chí là 4 byte).