اندیان
در علوم رایانه، واژه اِندیان یا اِندیَن (به انگلیسی:Endian) اشاره به چینش تک-مؤلفههای فرعی آدرسپذیری دارند که داخل یک داده بزرگتر در یک حافظه جانبی ذخیره گردیده است.(یا گاه، به یک ارتباط سریال ارسال گردیده است)
ریشهشناسی
اندین یا Endian استعارهای است به اختلاف دو قوم لیلیپوتی بر سر جهت بریدن سر تخممرغ آبپز در ماجراهای گالیور. یکی از این دوقوم تخممرغ آبپز را به روش سنتی از سر پهنتر باز میکردند که به بیگ اندین یا Big Endian معروف بودند و دیگری معتقد به بریدن سر کوچکتر تخممرغ بودند که به ایشان لیتل اندین یا Little Endian گفته می شد.
در علم کامپیوتر
هر بایت از حافظه آدرس منحصر به فرد خود را داراست و محتوای یک متغیر n بایتی، یک خانه ی n بایتی را از حافظه را اشغال میکند. یک رایانه بیگ اندین بایت پرارزش متغیر را در ابتداییترین خانه حافظه ذخیره میکند، در حالیکه یک رایانه لیتل اندین کم ارزشترین بایت متغیر را در ابتداییترین خانه حافظه ذخیره مینماید. چنانچه در شکلهای روبرو می بینیم اگر داده خود را 0A0B0C0Dh در نظر بگیریم در سیستمهای بیگ اندین 0Ah در اولین خانه حافظه دخیره میشود در حالیکه در سیستمهای لیتل اندین در آخرین فضای حافظه جای گرفتهاست. برای داده 0000111111110000b نیز به همین ترتیب، ۸ بیت پر ارزش، یعنی 00001111b در سیستم بیگ اندین در ابتداییترین خانه حافظه و در سیستم لیتل اندین در آخرین خانه حافظه میگیرد.
همچنین حالت سومی با نام میدل اندین یا Middle Endian وجود دارد که حالتهای بسیار متفاوتی دارد. مثلاً در PDP-11 کامپایلر مقادیر را مانند روش بیگ اندین اما با فرمت ۱۶ بیتی لیتل اندین ذخیره میکند. به عنوان مثال، مقدار ۳۲ بیتی 0A0B0C0Dh همانطور که در شکل زیر مشخص است، به صورت 0B0A0D0Ch ذخیره میشود. این حالت خاص، به لیتل اندین ۱۶ بیتی یا 16 Bit Little Endian معروف است.
جهت افزایش مقدار آدرس حافظه: → | |||||
0Ch | 0Dh | 0Ah | 0Bh |
بی اندین
سخت افزارهای دارای معماری بی اندین قابلیت سوئیچ بین دو حالت بیگ اندین و لیتل اندین را در سگمنت داده، سگمنت کد یا هر دو سگمنت را دارد. بسیاری از این سخت افزارها قابلیت انتخاب فرمت پیشفرض اندین را از طریق نرمافزار دارند، اما در برخی از آنها نیز حالت اندین را مادربرد انتخاب میکند و قابل تغییر نیست.
تفاوتها
در حالت لیتل اندین، در صورتی که مقدار AB000000h در خانهای ۴ بایتی از حافظه قرار داشته باشد، و چهار متغیر داشته باشیم که به این خانه از حافظه اشاره کنند، متغیر ۸ بیتی دارای ABh، متغیر ۱۶ بیتی دارای 00ABh، متغیر ۲۴ بیتی دارای 0000ABh و متغیر ۳۲ بیتی دارای 000000ABh خواهد بود. که در همه این چهار متغیر، مقدار مقدار عددی برابر با هم را خواهند داشت. هرچند این قابلیت سیستمهای لیتل اندین بسیار به ندرت توسط برنامه نویسان یک زبان برنامهنویسی سطح بالا مانند زبان سی شارپ استفاده میشود، اما در برخی زبانها مانند زبان اسمبلی جهت بهینهسازی نرمافزار و همچنین سیستم عاملها بسیار کاربردی است. همچنین بسیاری از زبانهای سطح بالای امروزی مانند PHP چنین قابلیتی ندارند.
سخت افزارها
معماریهای مختلف از شیوههای متفاوتی استفاده میکنند. به عنوان مثال در معماری ۳۲ بیتی x86 اینتل و نسخه ۶۴ بیتی آن که به X86-64 ای ام دی معروف است و امروزه در کامپیوترهای رومیزی استفادههای فراوانی دارند، از سیستم لیتل اندین استفاده میشود، در حالی که در معماری IBM z/Architecture از سیستم بیگ اندین استفاده میشود. معماری ARM نیز که در دستگاههای کوچک مانند تلفنهای هوشمند و تبلتها پرکاربرد هستند، بی اندین است و قابلیت سوییچ کردن بین حالتهای بیگ اندین، لیتل اندین و میدل اندین را داراست.
شبکه
در شبکه، network order در بسیاری از RFCها تعبیه شدهاست. در صورتی که چنین چیزی در RFC مربوط پیشبینی نشده باشد، معمولاً از روش بیگ اندین که در RFC 1700 ( استاندارد اینترنت ) تعبیه شده است، استفاده میشود، هرچند تمامی پروتکلها به این روش پایبند نیستند.
فایلها
فایلهای دادهای مانند فایلهای متنی txt، از روش بیگ اندین استفاده میکنند اما فایلهای متنی یونیکد میتوانند با چند بایت خاص که به BOM مشهورند شروع شوند و نوع قرارگیری بایتها را مشخص کنند. فایلهای تصاویر TIFF نیز با توجه به اینکه دارای پرچمی خاص هستند، قابلیت استفاده از هر دو حالت را دارند. بنابراین هر نوع فایل میتواند از هر روشی خاص جهت ذخیرهسازی استفاده کنند و بستگی به شیوه مهندسی آن نرمافزار خاص دارد.
همچنین، فایلهای اجرایی برنامه ها، با توجه به نوع کامپایلر میتواند متفاوت باشد که این مسئله باعث میشود یک برنامه که توسط کامپایلر بیگ اندین کامپایل شده، در سیستمهای لیتل اندین قابل اجرا نباشد. برخی از کامپایلرها قابلیت انتخاب ایندین توسط کاربر را دارند. برخی نیز به صورت خودکار، حالت ذخیره خود را تغییر می دهند و روی سخت افزارهای مختلف قابل اجرا هستند. در صورتی که کامپایلر از این قابلیت پشتیبانی نکند و برنامهنویس بخواهد که فایل کامپایل شده نرمافزارش بر روی تمامی سیستمها اجرا شود باید خود دست به کار شود. خروجی برخی زبانها مانند Java و جاوااسکریپت و PHP مستقل از سخت افزار هستند. برنامههای کامپایل شده JAVA، در زمان اجرا توسط JRE خوانده شده و با توجه به سخت افزار نوع آن انتخاب میشود اما PHP و JavaScript نیازی به کامپایل ندارند و مفسر PHP و مرورگر، آنها را مانند یک فایل متنی خوانده و اجرا میکند. هرچند فایلهای PHP را میتوان با نرمافزارهای مختلف کامپایل کرد و این فایلها و باز هم مستقل از سخت افزار هستند، چون وابسته به خود مفسر php هستند. زبانهایی که دارای مفسر هستند، مستقل از سخت افزار هستند، مانند زبانهای PHP و جاوااسکریپت. این زبانها برخلاف زبانهای سطح پایین، معمولاً دسترسی چندانی به خانههای حافظه نمیدهند، هرچند برای زبانهایی مانند PHP میتوان افزونههایی نوشت تا دسترسی به خانههای حافظه را ممکن سازد اما در زبانهایی مانند JavaScript چنین چیزی به دلایل امنیتی غیرممکن است.
روش تغییر ایندین
نمونه کد زیر که به زبان C میباشد، یک مقدار عددی ۳۲ بیتی بدون علامت را دریافت کرده و آن را از حالت بیگ اندین به لیتل اندین و بلعکس تبدیل میکند.
/* C function to change endianness for byte swap in an unsigned 32-bit integer */
uint32_t ChangeEndianness(uint32_t value)
{
uint32_t result = 0;
result |= (value & 0x000000FF) << 24;
result |= (value & 0x0000FF00) << 8;
result |= (value & 0x00FF0000) >> 8;
result |= (value & 0xFF000000) >> 24;
return result;
}
منابع
ویکیپدیای انگلیسی، Friday - 2015 29 May
- Danny Cohen (1980-04-01). On Holy Wars and a Plea for Peace. IETF. IEN 137. http://www.ietf.org/rfc/ien/ien137.txt. Also published at IEEE Computer, October 1981 issue.
- David V. James (June 1990). "Multiplexed buses: the endian wars continue". IEEE Micro. 10 (3): 9–21. doi:10.1109/40.56322. ISSN 0272-1732. Retrieved 2008-12-20.
- Bertrand Blanc, Bob Maaraoui (December 2005). "Endianness or Where is Byte 0?" (PDF). Retrieved 2008-12-21.