Big endian là gì

  -  
*
)

Little endian và big endian, đây là hai phương thức khác nhau để tàng trữ dữ liệu dạng nhị phân (binary). Bình thường thì họ cũng chẳng cần lưu ý đến chúng có tác dụng gì. Bởi vì mọi bài toán sẽ được tự động hoá hết.

Bạn đang xem: Big endian là gì

Thế nhưng bao gồm tình huống, ví dụ như khi bắt buộc xử lý những tập tin bao gồm cấu trúc, tập tin binary, duy nhất là số đông tập tin được ghi bằng ngữ điệu khác, thì bài toán hiểu về little endian với big endian là vô cùng quan trọng. Vì chưng nếu không, rất gồm thể họ sẽ đọc sai lắp thêm tự và giải pháp xử lý với tài liệu được gọi sai.

Dữ liệu

Dữ liệu là biểu đạt của tin tức dưới dạng lưu trữ được. Tin tức là thiết bị trừu tượng, không tồn tại hình dạng, đó là những hiểu biết về những sự vật, vấn đề xung quanh bọn chúng ta. Để lưu lại trữ, tương tự như truyền đạt tin tức đến các người, bọn họ cần cho dữ liệu. Dữ liệu hoàn toàn có thể là chữ viết, hình hình ảnh được ghi bên trên giấy, vớ cả chúng ta dữ liệu mà con người rất có thể hiểu được.

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

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

Thực ra, vật dụng tính không hiểu biết được các ký tự 0, 1 trong các hệ nhị phân đâu, nó vận động theo các tín hiệu điện tử. Tế bào tả đúng đắn thì khôn xiết khó, nhưng chúng ta cũng có thể hiểu "sơ sơ" rằng, chạm mặt bit 1 thì sẽ sở hữu được dòng diện, gặp gỡ bit 0 thì ko có. Như vậy, các bit 0, 1 được cách xử lý thành các tín hiệu năng lượng điện tử tương ứng, và chúng ta coi kia như máy tính đã gọi được tài liệu nhị phân.

Thế nhưng, mặc dù cùng thực hiện tín hiệu dạng nhị phân, những máy tính khác nhau cũng không đích thực nói bình thường một ngôn ngữ. Cũng giống như coi người vậy, khi nhìn các ký từ a, b, c có fan hiểu, có tín đồ không. Máy tính xách tay khi nhìn vào những tín hiệu tương xứng với các ký hiệu 0 tốt 1, mỗi lắp thêm tính rất có thể hiểu theo một bí quyết khác nhau.

Thế nhưng, khôn xiết may là các laptop vẫn vận động theo phần đa tiêu chuẩn chung, thế cho nên nó vẫn rất có thể giao tiếp với nhau được. Mặc dù nhiên, chú ý rằng, ko phải bất cứ lúc nào, các máy vi tính cũng có thể hiểu được lẫn nhau.

Trong thiết bị tính, các dữ liệu nhị phân không được xử trí theo từng bit riêng lẻ, nhưng mà được xử lý thành từng khối 8 bit một, và đơn vị xử lý nhỏ tuổ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à (ở trên đây tôi nhận định rằng kiểu tài liệu int đang có kích thước 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, chúng ta cũng có thể viết nó bên dưới dạng hexa như sau:

07 5b cd 15Đã gồm bao giờ, bạn tự hỏi, lúc ghi dữ liệu này 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ẽ tiến hành ghi lần lượt theo sản phẩm tự mà họ đang đọc cùng viết ngơi nghỉ trên, thì các bạn đã nhầm.

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

Little endian và big endian là gì?

Little endian và big endian là hai phương thức không giống nhau để lưu trữ dữ liệu. Sự khác hoàn toàn của little endian với big endian khi lưu lại trữ chính là ở việc sắp xếp thứ tự các byte dữ liệu.

Trong cơ chế lưu trữ little endian (xuất phạt từ "little-end" nghĩa kết thúc nhỏ dại hơn), byte sau cuối trong màn biểu 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 đang thành

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

07 5b cd 15Các thuật ngữ big-end xuất xắc little-end bắt đầu từ cuốn tè thuyết Gulliver du ký (Gulliver"s Travels), trong số ấy nhân vật dụng Lilliputans tranh luận về câu hỏi nên đập trứng bằng đầu to giỏi nhỏ.

Và ngành IT đã vận dụng thuật ngữ ngày, kha khá giống với nghĩa gốc. để ý rằng, little endian xuất xắc big endian chỉ khác nhau ở phương pháp sắp xếp những byte dữ liệu, còn đồ vật tự từng bit vào byte thì giống như nhau. Khôn cùng may, các máy tính xách tay vẫn gồm điểm trung này.

Thêm một xem xét nữa rằng, little endian giỏi big endian chỉ khác hoàn toàn khi cần lưu trữ những dữ liệu có khá nhiều byte. Những dữ liệu chỉ có 1 byte (ví dụ cam kết tự ASCII) thì không ảnh hưởng gì (chính xác là dù dùng cách làm nào công dụng cũng như nhau)

Little endian cùng big endian được sử dụng trên những máy vi tính nào?

Việc chuẩn bị xếp những byte dữ liệu theo giao diện little endian tuyệt big endian không chỉ là xảy ra khi chúng ta lưu trữ dữ liệu ra bộ lưu trữ ngoài. Mọi buổi giao lưu của máy tính rất nhiều sử dụng tài liệu nhị phân, bắt buộc little endian/big endian hiện hữu trong mọi hoạt động vui chơi của máy tính.

Ngoài việc thực hiện little endian/big endian 1 phần phụ thuộc vào ứng dụng (do lập trình sẵn viên thay ý sử dụng một trong hai loại, hoặc ngữ điệu lập trình phương tiện trước), nó còn dựa vào vào bộ vi cách xử lý của chính máy vi tính đó.

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

Các cỗ vi cách xử lý PowerPC với SPARK trước đó đều là big endian, nhưng bây chừ chúng cũng khá được nâng cấp thành bi-endian.

Các làm nào thì giỏi hơn: little endian tốt big endian?

Little endian tuyệt big endian cũng như tranh luận cội về việc đập trứng, không có một thủ tục nào thực sự giỏi hơn cách làm nào.

Little endian hay big endian chỉ khác nhau ở việc lưu trữ thứ tự các byte dữ liệu. Cả hai phương thức đều không làm ảnh hưởng đến vận tốc xử lý của CPU. Thế cho nên cả nhì phương thức số đông vẫn tồn tại song song với sẽ không bao giờ có thể bao gồm một câu trả lời thoả đáng: phương thức nào thì xuất sắc hơn?

Mỗi phương thức đều phải có những ưu thế nhất định. Với little endian, vì byte nhỏ nhất luôn nằm mặt trái, nó sẽ mang đến phép họ đọc dữ liệu với độ nhiều năm tuỳ ý. Nó sẽ rất tương thích nếu bọn họ cần xay kiểu, lấy ví dụ như từ int thành long int.

Với đưa định int là 4 byte, long int là 8 byte, nếu cần sử dụng little endian, khi nghiền kiểu, add bộ nhớ không cần phải thay đổi, họ chỉ buộc phải ghi tiếp những byte to hơn mà thôi.

Nhưng giả dụ cũng trường hợp đó, mà thực hiện big endian, thì bọn họ sẽ đề nghị dịch showroom bộ nhớ lúc này thêm 4 byte nữa bắt đầu có không gian để lưu giữ trữ.

Nhưng big endian cũng đều có nhưng điểm mạnh nhất định, với bài toán đọc dữ liệu byte lớn số 1 trước, nó sẽ rất tiện lợi kiểm tra một trong những là âm xuất xắc dương, vì chưng byte cất dấu được phát âm đầu tiên.

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

Chương trình C đơn giản dễ dàng nhau cho bọn họ cách quan sát về bài toán sắp xếp các byte trong bộ nhớ.

Xem thêm: Chia Sẻ Kinh Nghiệm Đi Đồng Mô Mới Nhất: Chi Phí, Ăn Ở, Du Lịch Đồng Mô 1 Ngày

#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 call above function for 0x01234567 */intmain () int i = 0x01234567; show_mem_rep ((char *) &i, sizeof (i)); return 0;Khi thực hiện chương trình trên, ví như máy của công ty là little endian thì hiệu quả sẽ là

67 45 23 01còn trường hợp máy bạn là big endian thì nó vẫn hiển thị theo sản phẩm công nghệ tự thông thường

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

Nếu máy tính xách tay của họ là little endian thì byte đầu tiên này đang là 1, trái lại thì nó vẫn là 0.

Điều này ảnh hưởng thế nào tới sự việc lập trình

Về cơ bạn dạng thì little endian tuyệt big endian ko có tác động lắm đến việc lập trình. đa số các lập trình viên ko cần đon đả nhiều lắm, vì chưng mọi bài toán đã được các trình biên dịch/thông dich đảm nhận hết.

Tuy nhiên, một trong những trường hợp, họ cần quan liêu tâm, đặc biệt khi đổi khác dữ liệu giữa các laptop khác nhau. Ví dụ: khi họ cần cách xử lý một file có cấu tạo thế này, 4 byte đầu tiên là một vài nguyên n, sau đó là n số nguyên, mỗi số chỉ chiếm 4 byte bộ nhớ, v.v...

Trong trường thích hợp này, khi nhận file được tạo ra từ một máy tính xách tay khác, câu hỏi nó được ghi theo kiểu little endian tuyệt big endian ví dụ là tác động rất nghiêm trọng, nếu áp dụng sai phương thức, chúng ta sẽ thu về dữ liệu sai.

Một trường hòa hợp khác nữa rất có thể xảy ra sự việc là khi bọn họ ép kiểu cho các 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 trên, họ đã ép thứ hạng một array hai thành phần char thành một trong những nguyên 2 byte (short int). Trong ví dụ như này, little endian giỏi big endian cũng có tác động rất lớn.

Một máy tính dùng little endian sẽ có công dụng là 1 trong những khi big endian đã cho hiệu quả là 256. Để tránh số đông lỗi xứng đáng tiếc có thể xảy ra, phần lớn code như trên rất cần được tránh.

Vấn đề NUXI

NUXI là một trong những vấn đề rất nổi tiếng liên quan đến little endian với big endian: UNIX được lưu lại trong một khối hệ thống big-endian sẽ được hiểu là NUXI trong một hệ thống little endian.

Giả sử họ cần tàng 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 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ả toàn chủ quyền với hệ thống, bất kỳ nó là little giỏi big endian. Nếu họ lưu trữ những giá trị "UN" cùng "IX" khi hiểu ra, nó vẫn sẽ là "UNIX" xuất xắc không? trường hợp mọi câu hỏi chỉ xảy ra trên một vật dụng tính, mặc dù cho là big endian hay little endian thì nó sẽ luôn là như vậy, vị mọi thứ vẫn được tự động hóa hoá giúp chúng ta.

Với bất cứ dữ liệu nào cũng vậy, bọn họ luôn thu được tài liệu đúng nếu đọc cùng ghi trong cùng một hệ thống. Cố kỉnh nhưng, hãy để ý kỹ rộng về bài toán sắp xếp những byte trong cỗ nhớ.

Một hệ thống big endian sẽ lưu trữ như sau:

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

N U X IMặc cho dù trông khá ngược nhưng hệ thống little endian vẫn xử lý câu hỏi đọc giúp chúng ta, nên lưu trữ như vậy tuy thế khi mang ra bọn họ vẫn có dữ liệu ban đầu. Mặc dù thế khi họ ghi dữ liệu này ra file, đưa sang một máy tính xách tay khác. Cùng mỗi máy tính xách tay lại xử lý theo phong cách riêng của chính nó thì UNIX trên đồ vật big endian sẽ được hiểu là NUXI trên vật dụng little endian (và ngược lại).

Đây đó là vấn đều nguy hiểm nhất khi bọn họ trao đỏi dữ liệu qua lại giữa các máy vi tính với nhau, đặc biệt trong thời đại mạng internet ngày nay.

Trao đổi dữ liệu giữa các máy có endian không giống nhau

Ngày nay, mọi máy tính xách tay đều được kết nối để trao đổi dữ liệu với nhau. Little endian tuyệt big endian cũng đầy đủ phải bàn bạc với nhau, nhưng lại làm chũm nào để có hiểu được nhau khi chúng không nói phổ biến một vật dụng tiếng?

Có 2 giải pháp chính cho câu hỏi này

Sử dụng bình thường định dạng

Một phương án đơn giản nhất tất cả sử dụng tầm thường một định dang khi truyền dữ liệu.

Ví dụ đông đảo tập tin dạng PNG đều bắt buộc phải sử dụng big endian. Tựa như với những tập tin có kết cấu khác. Đó là tại sao vì sao chúng ta nhiều khi rất cần được dùng phần đa phần mềm chuyên được dùng để đọc với ghi các file này.

Thế tuy nhiên trong liên kết với Internet, việc truyền tài liệu còn phức hợp hơn thế. Chúng ta không thể cứ dùng một format file như thế nào đó, rồi truyền từng byte một sang đồ vật khác được. Ao ước 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 có một chuẩn chỉnh chung. Hiện nay nay, chuẩn chỉnh chung cho việc truyền tài liệu trên mạng, hotline là network byte order đó là big endian. Vậy nhưng, dù đã chuẩn chỉnh chung rồi, thỉnh thoảng vẫn có những giao thức đùa chội hơn, thực hiện little endian.

Để có thể chuyển đổi dữ liệu thành dữ liệu chuẩn theo network byte order, chương trình cần 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 cần làm những gì cả, còn little endian sẽ tiến hành chuyển đối các byte một chút.

Dù hệ thống big endian ko cần thay đổi dữ liệu, bài toán gọi hàm này vẫn chính là rất đề nghị thiết. Lịch trình của bạn có thể được viết bởi một ngôn từ (C) nhưng có thể được dịch và xúc tiến ở nhiều khối hệ thống khác nhau, việc gọi hàm này sẽ giúp bọn họ làm điều đó.

Tương tự, sinh hoạt chiều ngược lại, bọn họ cần gọi hàm ntoh* để đổi khác dữ liệu nhận thấy từ mạng về tài liệu máy tính rất có thể hiểu được. Kế bên ra, chúng ta còn phải làm rõ kiểu dữ liệu mà bọn họ cần biến đổi nữa, danh sách các hàm chuyển đổi như sau:

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

Những hàm này vô cùng quan trọng khi tiến hành chia vẫn dữ liệu ở tầng thấp, lấy một ví dụ khi chất vấn checksum của các gói tin chẳng hạn. Nếu không làm rõ về little endian với big endian thì khi cần thao tác về mạng, bạn sẽ gặp những khó khăn.

Sử dụng BOM (Byte Order Mark)

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

Nếu bạn đọc ký tự này là 0xFFFE (bị ngược) thì có nghĩa tệp tin này được ghi với endian không giống với hệ thống của bạn, khi đó, bạn sẽ cần phải biến hóa phương thức đọc tài liệu một chút.

Có một vài vấn đề nhỏ tuổi với việc áp dụng BOM. Thứ nhất, BOM sẽ gây ra tăng tài liệu được ghi vào file. Trong cả khi họ chỉ giữ hộ đi 2 byte dữ liệu, họ vẫn nên thêm 2 byte BOM nữa.

Xem thêm: 30 Best Luxury Hotels And Resorts In Da Nang Luxury Beach Resorts

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