فایل باینری چیست

با سلام
تا جایی که من می دونم دو نوع فایل داریم یه فایل متنی یه فایل باینری
فایل متنی توی ویندوز با notepad و توی لینوکس با vi یا نرم افزارهای دیگه باز میشه.
فایل متنی با پیروی از یک استاندارد قابل فهم برای ما هست.
اگر بخواهیم تعریفی از فایل باینری داشته باشیم , چی باید گفت؟
ممنون میشم کمکم کنید

1 Like
A binary file is a computer file that is not a text file.[1] The term "binary file" is often used as a term meaning "non-text file".[2] Many binary file formats contain parts that can be interpreted as text; for example, some computer document files containing formatted text, such as older Microsoft Word document files, contain the text of the document but also contain formatting information in binary form.[2]
1 Like

خب فایل متنی هم باینریه دیگه!
فایل متن هم در حقیقت یه فایل باینریه که اطلاعات داخلش، کد اسکی یا utf-8 هستن.

ولی به هر حال به فایلی که قراره کامپیوتر بخونتش میگن باینری. چون ما درکی ازش نداریم و بایت‌های تشکیل دهندش برای ما نامفهومه. (مثلا سورسهای نرم‌افزارها)
فایلهای باینری هم عموما بخشهایی دارن که متن قابل فهم برای ما نوشته شده (همونطور که @shahryarjb گفتن)
برای خوندن این متنها توی لینوکس میتونید از strings استفاده کنید.

strings filename

فایلهای باینری در لینوکس اصولا پسوند ندارن.
اصولا همه‌ی فایلها دو خط اولشون توضیحاتی برای نحوه‌ی اجراشون وجود داره. این جزء استاندارد فرمتشونه.
به عنوان مثال یه فایل png اینطوری شروع میشه:

  1 <89>PNG^M                                                                                                                                                
  2 ^Z
  3 ^@^@^@^MIHDR^@^@^B<80>^@^@^@ ^H^F^@^@^@<9c>þÝ<^@^@^@^FbKGD^@ÿ^@ÿ^@ÿ ½§<93>^@^@^@  pHYs^@^@.#^@^@.#^Ax¥?v^@^@^@^GtIME^Gã^H^G %[email protected]<9f>¿^@^@^@^YtEXtComment^    @Created with GIMPW<81>^N^W^@^

و یه فایل jpeg اینطوری:

   1 ÿØÿà^@^PJFIF^@^A^A^@^@^A^@^A^@^@ÿÛ^@C^@^B^B^B^B^B^B^B^B^B^B^C^B^B^B^C^D^C^B^B^C^D^E^D^D^D^D^D^E^F^E^E^E^E^E^E^F^F^G^G^H^G^G^F                           

(اصولا چند بایت اول فایلها، توضیحی برای نحوه‌ی خوندن بقیه‌ی بایت‌هاست. با استفاده از همین بخش از فایل، یه سری از فایل‌منیجرهای لینوکسی اگه پسوند فایل رو بردارید باز هم میفهمه این چه فایلیه و حتی thumbnail هم میسازه براش.)


همه‌ی فایلهای کامپیوتر باینری هستن. طور دیگه‌ای نمیتونه باشه.
حالا یه سریاش با کدهای اسکی و utf-8 پر شدن و مستقیما برای ما قابل خوندن هستن، یه سریهای دیگه نه.

3 Likes

ممنونم , دست شما درد نکنه
فقط یه چیزی:
مگه منظور از باینری صفر و یک نیست , پس باید تشکیل دهنده فایل ها صفر و یک باشه , چرا فایل ها مثلا png را با text editor باز میکنی غیر صفر و یک کاراکترهای دیگه هم نشون میده ؟
آیا وقتی میگیم فایل ها باینری هستن , یعنی فقط صفر و یک هستند ؟

ببینید، کامپیوتر چیزی بجز ۰ و ۱ نمیفهمه و چیزی بجز ۰ و ۱ نمیتونه ذخیره کنه یا انتقال بده (به اثتثنای امواج آنالوگ که بحثشون جداست)

فایلها توی هارد‌دیسک به شکل ۰ و ۱ نوشته میشن. هر ۸تا صفر یا یک، میشه یک بایت. تا اینجاش چیز جدیدی نداره.
حالا متنها چطوری ذخیره میشن؟
متن هم اگه ascii باشه، کاراکترها تبدیل میشن به کد اسکی مثلا از ۴۸ تا ۵۷ میشه اعداد ۰ تا ۹ و از ۶۵ تا ۹۰ میشه A تا Z (حروف بزرگ) و…
کامپیوتر میاد کاراکترهای ما رو تبدیل میکنه به این کدهای اسکی (که عدد هستن بر مبنای ۱۰) و بعد این اعداد رو تبدیل میکنه به باینری (مبنای ۲) و ذخیره میکنه روی هارد. (دقیقا سیستم اینطوری نیست ولی میشه اینطوری تصورش کرد)
موقع خوندن هم اگه فکر کنه این یه فایل متنی هست، میاد به قسمتهای ۸بایتی تقسیمش میکنه و فکر میکنه اینا کد اسکی هستن و میخواد کاراکتر متناسب باهاشون رو نشون بده.
وقتی شما یه فایل متنی رو باز میکنید اینکار رو انجام میده. وقتی شما یه فایل غیر متنی رو با text editor باز میکنید هم سعی میکنه همینکار رو انجام بده.
حالا اگه اون فایل غیر متنی، عکس باشه، یه text editor معمولی نمیتونه (بلد نیست) بخونتش و به روش خودش بازش میکنه. حالا اگه همون عکس رو بدیم به یه نرم‌افزار مثلا sxiv، یه مدل دیگه بازش میکنه و میتونه دیتاهای پیکسلهای RGB رو بخونه و نمایش بده.

برای اینکه واقعا 0 و 1 های داخل فایلهای باینری رو ببینیم (و بتونیم یک فایل باینری بسازیم با نوشتن ۰ها و ۱ها)، احتمالا باید بشینیم یه نرم‌افزار (مثلا یه اسکریپت ساده‌ی پایتون) بنویسیم که فایلها رو بخونه و به بخشهای ۸بیتی تقسیم کنه و نمایش بده.

یه نکته‌ی دیگه هم هست. حتی همین متنها هم همشون مثل هم نیستن.
اگه میخوایم یه متن فارسی توی یه فایل ذخیره کنیم باید حتما فرمتش UTF-8 باشه. نمیشه توی فایل ascii متن فارسی (یا ژاپنی و…) نوشت. تفاوت utf-8 و ascii اینه که توی utf-8 هر کاراکتر ۲بایت فضا اشغال میکنه (۱۶بیت).
اگه یه نرم‌افزاری فقط برای خوندن و نوشتن ascii آماده باشه، نمیتونه utf-8 بخونه (درست نمایش نمیده کاراکتر ها رو)

اگه دنبال یه زبان برنامه نویسی میگردید که هنوز اونقدر احمق باشه که ندونه utf-8 یعنی چی، بهتون php رو پیشنهاد میکنم. ایشون همه‌ی stringها رو به صورت دیفالت ۸بیتی در نظر میگیره.

2 Likes

خیلی خیلی ممنونم ازتون
شما فوق العاده هستید
علت طرح همچین سوالات این است که می خوام درکم از علم کامپیوتر عمیق بشه

1 Like