Computer >> Máy Tính >  >> Lập trình >> C ++

Làm cách nào để chuyển đổi giữa các giá trị big-endian và little-endian trong C ++?

Ở đây chúng ta sẽ xem cách chuyển giá trị Little endian thành Big endian hoặc big endian thành little endian trong C ++. Trước khi đi vào cuộc thảo luận thực tế, chúng ta sẽ xem endian lớn và endian nhỏ là gì?

Trong các kiến ​​trúc khác nhau, dữ liệu nhiều byte có thể được lưu trữ theo hai cách khác nhau. Đôi khi các byte thứ tự cao hơn được lưu trữ đầu tiên, trong trường hợp đó, chúng được gọi là endian lớn và đôi khi các byte thứ tự thấp hơn được lưu trữ đầu tiên, sau đó nó được gọi là endian nhỏ.

Ví dụ:nếu số là 0x9876543210, thì endian lớn sẽ là -

Làm cách nào để chuyển đổi giữa các giá trị big-endian và little-endian trong C ++?

Endian nhỏ sẽ như thế này -

Làm cách nào để chuyển đổi giữa các giá trị big-endian và little-endian trong C ++?

Trong phần này, chúng ta sẽ xem cách chuyển đổi endian nhỏ thành endian lớn và ngược lại. Để làm điều này, chúng ta phải hoán đổi các byte thứ 1 và thứ 4, và byte thứ 2 và thứ 3. Chúng ta có thể trao đổi chúng bằng cách sử dụng các biểu thức logic. Tạo Bản sao của số bốn lần, sau đó đối với bản sao đầu tiên, dịch byte thứ nhất 24 lần sang bên phải, đối với bản sao thứ hai, che dấu nó bằng 00FF0000, sau đó hoán đổi 8 bit sang bên phải, cho bản sao thứ 3 che dấu nó bằng 0000FF00 , sau đó dịch sang trái 8 bit, và đối với bản sao cuối cùng, hãy hoán đổi các phần tử sang trái 24 lần. Sau đó một cách hợp lý HOẶC bốn bản sao này để nhận được kết quả đảo ngược.

Ví dụ

#include <iostream>
#define SWAP_INT32(x) (((x) >> 24) | (((x) & 0x00FF0000) >> 8) | (((x) & 0x0000FF00) << 8) | ((x) << 24)) using namespace std;
void memory_represent(char *value, int n) {
   int i;
   for (i = 0; i < n; i++)
      printf(" %.2x", value[i]);
}
int main() {
   unsigned int x = 0x9876543210;
   int y;
   cout << "The little endian value is: ";
   memory_represent((char*)&x, sizeof(x));
   cout << endl;
   y = SWAP_INT32(x);
   cout << "The Big endian value after conversion is: ";
   memory_represent((char*)&y, sizeof(y));
   cout << endl;
}

Đầu ra

The little endian value is: 10 32 54 76
The Big endian value after conversion is: 76 54 32 10