বহু-বাইট ডেটা মেমরিতে দুভাবেই স্টোর হতে পারে: বিগ-এন্ডিয়ান (MSB প্রথমে) এবং লিটেল-এন্ডিয়ান (LSB প্রথমে)। নেটওয়ার্ক অর্ডার (Big-endian) এবং x86 আর্কিটেকচার (Little-endian) আলাদা। কনভার্সন জন্য বাইট সওয়াপ করতে হয়।
মেমরি রিপ্রেজেন্টেশন (0x9876543210)
| বাইট অফসেট | Big-Endian | Little-Endian |
|---|---|---|
| 0 | 0x98 | 0x10 |
| 1 | 0x76 | 0x32 |
| 2 | 0x54 | 0x54 |
| 3 | 0x32 | 0x76 |
| 4 | 0x10 | 0x98 |
32-বিট ইন্টিজার বাইট সওয়াপ (বিটওয়াইজ)
#define SWAP_INT32(x) ( \
((x) >> 24) | \
(((x) & 0x00FF0000) >> 8) | \
(((x) & 0x0000FF00) << 8) | \
((x) << 24) \
)
উদাহরণ কোড
#include <iostream>
#include <cstdio>
#define SWAP_INT32(x) (((x) >> 24) | (((x) & 0x00FF0000) >> 8) | (((x) & 0x0000FF00) << 8) | ((x) << 24))
void print_bytes(const char* label, unsigned int val) {
printf("%s: ", label);
for (int i = 0; i < 4; i++)
printf(" %.2x", reinterpret_cast<const unsigned char*>(&val)[i]);
printf("\n");
}
int main() {
unsigned int x = 0x98765432; // 32-bit উদাহরণ
print_bytes("Little-endian", x);
unsigned int y = SWAP_INT32(x);
print_bytes("Big-endian", y);
return 0;
}
আউটপুট
Little-endian: 32 54 76 98 Big-endian: 98 76 54 32
পোর্টেবল সমাধান (C++23 / Boost / Endian হেডার)
- C++23:
std::byteswap(header ``) - Boost:
boost::endian::big_to_native,native_to_big - POSIX:
htonl,ntohl(network byte order)
দ্রষ্টব্য: আধুনিক কোডে হাতের বাইট সওয়াপ না লিখে স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করুন।