Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ฉันจะแปลงระหว่างค่า big-endian และ little-endian ใน C ++ ได้อย่างไร


ที่นี่เราจะมาดูวิธีการแปลงค่า endian น้อยเป็นค่า endian ใหญ่หรือค่า endian ใหญ่เป็น endian น้อยใน C ++ ก่อนจะไปเสวนาจริง ๆ เรามาดูว่า endian ใหญ่กับ endian เล็กคืออะไร?

ในสถาปัตยกรรมที่แตกต่างกัน ข้อมูลแบบหลายไบต์สามารถจัดเก็บได้สองวิธี บางครั้งไบต์ลำดับที่สูงกว่าจะถูกเก็บไว้ก่อน ในกรณีนี้เรียกว่า big endian และบางครั้งไบต์ลำดับที่ต่ำกว่าจะถูกเก็บไว้ก่อน จากนั้นจึงเรียกว่า little endian

ตัวอย่างเช่น หากตัวเลขคือ 0x9876543210 ดังนั้น endian ตัวใหญ่จะเป็น −

ฉันจะแปลงระหว่างค่า big-endian และ little-endian ใน C ++ ได้อย่างไร

เอ็นเดียนตัวน้อยจะเป็นแบบนี้ -

ฉันจะแปลงระหว่างค่า big-endian และ little-endian ใน C ++ ได้อย่างไร

ในส่วนนี้ เราจะมาดูวิธีการแปลง endian น้อยเป็น endian ใหญ่และในทางกลับกัน ในการทำเช่นนี้เราต้องสลับไบต์ที่ 1 และ 4 และ 2 และ 3 เราสามารถแลกเปลี่ยนกันได้โดยใช้นิพจน์เชิงตรรกะ ทำสำเนาตัวเลขสี่ครั้ง จากนั้นสำหรับสำเนาแรก เลื่อนไบต์ที่ 1 ไปทางขวา 24 ครั้ง สำหรับสำเนาที่สอง ปิดบังด้วย 00FF0000 จากนั้นสลับ 8 บิตไปทางขวา สำหรับสำเนาที่ 3 มาสก์ด้วย 0000FF00 จากนั้นเลื่อนไปทางซ้าย 8 บิต และสำหรับสำเนาสุดท้ายให้สลับองค์ประกอบไปทางซ้าย 24 ครั้ง จากนั้นใช้ตรรกะหรือสำเนาทั้งสี่นี้เพื่อให้ได้ผลลัพธ์ที่ย้อนกลับ

ตัวอย่าง

#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;
}

ผลลัพธ์

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