كيف يمكنني التمييز بين ملفات "Binary" و "النص"؟
-
05-09-2019 - |
سؤال
بشكل غير رسمي، معظمنا يفهمون أن هناك ملفات "ثنائية" (ملفات الكائنات والصور والأفلام والأفلام والتنفيذية وتنسيقات المستندات الخاصة أو إلخ) وملفات "النص" (شفرة المصدر وملفات XML وملفات HTML والبريد الإلكتروني، إلخ).
بشكل عام، تحتاج إلى معرفة محتويات الملف لتتمكن من القيام بأي شيء مفيد معه، وتشكيل نقطة الرأي إذا كان الترميز هو "نص ثنائي" أو "نص"، فهذا لا يهم حقا. وبالطبع ملفات فقط تخزين بايت من البيانات بحيث تكون كل "نص ثنائي" و "النص" يعني أي شيء دون معرفة الترميز. ومع ذلك، لا يزال من المفيد التحدث عن الملفات "الثنائية" و "النص"، ولكن لتجنب الإساءة إلى أي شخص مع تعريف غير دقيق، سأستمر في استخدام علامات اقتباس "تخويف".
ومع ذلك، هناك أدوات مختلفة تعمل على مجموعة واسعة من الملفات، وبشروط عملية، تريد القيام بشيء مختلف بناء على ما إذا كان الملف هو "النص" أو "ثنائي". مثال على هذه أداة تخرج البيانات الموجودة على وحدة التحكم. سوف تبدو "النص" عادي بشكل جيد، وهو مفيد. البيانات "الثنائية" تعويث محطةك، وعادة ما لا يكون مفيدا للنظر في. يستخدم GNU GREP على الأقل هذا التمييز عند تحديد ما إذا كان يجب إخراج المباريات إلى وحدة التحكم.
لذلك، فإن السؤال هو، كيف يمكنك معرفة ما إذا كان الملف هو "نص" أو "ثنائي"؟ والتقييد هو كذلك، كيف يمكنك معرفة نظام Linux مثل نظام الملفات؟ أنا لست على علم بأي بيانات META نظام الملفات التي تشير إلى "نوع" الملف، لذلك يصبح السؤال كذلك، عن طريق فحص محتوى الملف، كيف يمكنني معرفة ما إذا كان "نص" أو "ثنائي"؟ وبالنسبة للبساطة، يتيح لك تقييد "النص" أن تعني الأحرف القابلة للطباعة على وحدة التحكم في المستخدم. وعلى وجه الخصوص كيف يمكنك ينفذ هذه؟ (اعتقدت أن هذا كان ضمنا على هذا الموقع، لكنني أعتقد أنه مفيد، بشكل عام، يجب الإشارة إلى التعليمات البرمجية الموجودة التي لا يجب أن تكون قد حددها)، وأنا لست حقا بعد ما يمكن أن تستخدم البرامج الحالية للقيام بها هذه.
المحلول
برنامج جدول البيانات يجعل شركتي يقرأ عددا من تنسيقات الملفات الثنائية وكذلك الملفات النصية.
نحن ننظر أولا إلى البايت القليلة الأولى ل رقم السحر الذي ندرك. إذا لم نتعرف على العدد السحري لأي من الأنواع الثنائية التي نقرأها، فإننا ننظر إلى ما يصل إلى أول 2K بايت من الملف لمعرفة ما إذا كان يبدو أنه UTF-8., UTF-16. أو ملف نصي مشفر في الحالي رمز الصفحة نظام التشغيل المضيف. إذا مرر أي من هذه الاختبارات، فلا نفترض أنه ليس ملفا يمكننا التعامل مع وإلقاء استثناء مناسب.
نصائح أخرى
يمكنك استعمال ال file
أمر. انها حفنة من الاختبارات على الملف (man file
) أن تقرر ما إذا كان ثنائي أو نص. يمكنك إلقاء نظرة على / استعارة شفرة المصدر الخاصة بها إذا كنت بحاجة إلى القيام بذلك من C.
file README
README: ASCII English text, with very long lines
file /bin/bash
/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped
يمكنك تحديد نوع التمثيل الصامت من الملف مع
file --mime FILENAME
الاختزال هو file -i
على لينكس و file -I
(رأس المال I) على ماكوس (انظر التعليقات).
إذا بدأت text/
, ، إنه نص، وإلا ثنائي. الاستثناء الوحيد هو تطبيقات XML. يمكنك مطابقة تلك من خلال البحث عن +xml
في نهاية نوع الملف.
حسنا، إذا كنت تقوم فقط بفحص الملف بأكمله، راجع ما إذا كان كل حرف قابل للطباعة isprint(c)
. وبعد يحصل أكثر تعقيدا قليلا في يونيكود.
لتمييز ملف unicode النصي، تقدم MSDN بعض النصائح الرائعة فيما يتعلق بما يجب القيام به.
جوهرها هو أول تفقد لأول أربع البايتات:
EF BB BF UTF-8
FF FE UTF-16, little endian
FE FF UTF-16, big endian
FF FE 00 00 UTF-32, little endian
00 00 FE FF UTF-32, big-endian
هذا سوف اقول لك الترميز. ثم، كنت تريد استخدام iswprint(c)
لبقية الأحرف في الملف النصي. بالنسبة إلى UTF-8 و UTF-16، تحتاج إلى تحليل البيانات يدويا منذ أن يمكن تمثيل حرف واحد بعدد متغير من البايتات. أيضا، إذا كنت حقا شرجي، سترغب في استخدام البديل Locale iswprint
إذا كان هذا متاحا على منصة الخاص بك.
بيرل لديه سيريسي لائق. استخدم ال -B
مشغل لاختبار ثنائي (وعكس ذلك، -T
لاختبار النص). إليك Shell Liner One-List لسرد الملفات النصية:
$ find . -type f -print0 | perl -0nE 'say if -f and -s _ and -T _'
(لاحظ أن هؤلاء الشرطة السفلية دون دولار سبق هم صحيحون (RTFM).)
معظم البرامج التي تحاول أن تخبر الفرق استخدام مزحة، مثل فحص الأول ن بايت الملف ورؤية ما إذا كانت تلك البايتات الكل يتأهل ك "نص" أم لا (أي، هل يسقطون جميعا ضمن مجموعة من Charters ASCII للطباعة). للحصول على أدق Dishtion، هناك دائما أمر "الملف" في أنظمة مثل UNIX.
إنه موضوع قديم، ولكن ربما سيجد شخص ما هذا مفيدا. إذا كان عليك أن تقرر في البرنامج النصي إذا كان هناك شيء هو ملف، فيمكنك ببساطة القيام بذلك:
if file -i $1 | grep -q text;
then
.
.
fi
سيحصل ذلك على نوع الملف، ومع GREP الصامت، يمكنك تحديد ما إذا كان نصها.
لسرد أسماء الملفات النصية في Dir / Subdirs الحالي:
$ grep -rIl ''
الثنائيات:
$ grep -rIL ''
للتحقق من ملف معين، قم بتعديل الأمر قليلا:
$ grep -qI '' FILE
بعد ذلك، تعني حالة الخروج "0" أن الملف هو نص؛ "1" - ثنائي. يمكن التحقق:
$ echo $؟
فحص بسيط واحد هو إذا كان لديه \0
الشخصيات. الملفات النصية لا تملكها.
كما ذكرت أنظمة التشغيل nix سابقا هذه القدرة داخل أمر الملف. يستخدم هذا الأمر ملف تكوين يحدد الأرقام السحرية الموجودة داخل العديد من هياكل الملفات الشائعة.
تم تخزين هذا الملف يسمى السحر تاريخيا في / إل سي، على الرغم من أن هذا قد يكون في / USR / مشاركة على بعض التوزيعات. يحدد الملف السحري إزاحة القيم المعروفة الموجودة داخل الملف ويمكنه بعد ذلك فحص هذه المواقع لتحديد نوع الملف.
يمكن العثور على هيكل ووصف الملف السحري من خلال استشارة الصفحة اليدوية ذات الصلة (MAN MAGIC)
أما بالنسبة للتنفيذ، فقد تم العثور عليه جيدا ملف file.c. نفسها، ومع ذلك الجزء ذو الصلة من أمر الملف الذي يحدد ما إذا كان النص قابل للقراءة أم لا هو التالي
/* Make sure we are dealing with ascii text before looking for tokens */
for (i = 0; i < nbytes - 1; i++) {
if (!isascii(buf[i]) ||
(iscntrl(buf[i]) && !isspace(buf[i]) &&
buf[i] != '\b' && buf[i] != '\032' && buf[i] != '\033'
)
)
return 0; /* not all ASCII */
}