متوفر أيضًا بلغات أخرى: English · Español · Português · Français
بصمات الملفات والأرقام السحرية
الأرقامُ السحرية لثلاثٍ وثلاثين صيغة، لكلٍّ منها الوثيقةُ التي تحدّدها فعلًا، وأداةُ تعرُّفٍ لا تقرأ إلا الترويسة، في متصفحك.
ما بصمةُ الملف؟
بصمةُ الملف — أو الرقمُ السحريّ — سلسلةٌ قصيرةٌ ثابتةٌ من البايتات في أول الملف تقول ما نوعُه. فكلُّ ملفّ PNG يبدأ بالبايتات الثماني نفسِها، وكلُّ أرشيف gzip يبدأ بالبايتين نفسيهما. وتقرأها البرامجُ لأنّ الاسمَ ليس دليلًا: فتغييرُ اسم جدولٍ حسابيٍّ إلى .png لا يغيّر شيئًا مما بداخله، والملفُّ الآتي من الإنترنت يحمل الاسمَ الذي اختاره مرسِلُه.
والقائمةُ أدناه فيها ثلاثٌ وثلاثون صيغةً ببايتاتها، وموضعُ تلك البايتات من الملف، ونوعُ الوسائط حيث يكون مسجَّلًا. وفيها أيضًا ما تُسقطه الجداولُ المنقولةُ بعضُها عن بعض: الوثيقةُ التي تحدّد كلَّ بصمة. وهذا العمودُ هو المثيرُ للاهتمام كما تبيّن.
لأنّ الجوابَ ليس واحدًا. فبعضُ البصمات مثبَّتٌ في المتن المُلزِم لمعيارٍ منشور، وبعضُها ليس إلا في توثيق المُنتِج نفسِه، وبعضُها في وثيقةٍ لم يعد لها وزن. وقليلٌ منها — ICO وbzip2 و7-Zip — تنفّذه كلُّ أداةٍ في الأرض تنفيذًا واحدًا، ولم يُكتب قطُّ في أيّ مكانٍ بوصفه شرطًا.
كيف تستعملها
- أفلِت ملفًّا، أو اخترْه. لا تُقرأ إلا الترويسة، ويقرؤها متصفحُك. ولا يُرفع شيء. فإن طابقت بصمةٌ حصلتَ على الصيغة والبايتات التي طابقت وموضعِ تحديدها.
- أو الصق البايتات التي معك. إن كنت تنظر في تفريغٍ ستّ عشريّ فالصق البايتات الأولى. تُقبل المسافاتُ وبادئاتُ 0x والحروفُ الصغيرة؛ كلُّ ما يلزم عددٌ زوجيٌّ من الخانات.
- ابحث في القائمة بأيّ شيءٍ في الصفّ. يصلح اسمُ الصيغة أو الامتدادُ أو نوعُ الوسائط أو بادئةٌ ستّ عشرية أو اسمُ مواصفة. وكتابةُ png تضع PNG أولًا بدل أن تدفنه تحت كلّ ما يحوي تلك الحروف.
بصمةُ PNG، والتعليلُ الذي أسقطه المعيار
PNG هي الصيغةُ الجديرةُ بالنظر عن قرب، فبايتاتُها الثمانُ أدقُّ ما في القائمة تصميمًا، وقصّتُها ليست ما تتوقّع. وهي 137 و80 و78 و71 و13 و10 و26 و10؛ وبالنصّ: بايتٌ بتُه الأعلى مرفوع، ثم PNG، ثم إرجاعُ سطر، ثم سطرٌ جديد، ثم control-Z، ثم سطرٌ جديدٌ أخير.
ولكلٍّ منها عمل. فالبايتُ الأولُ ليس حرفَ ASCII عن قصد، كي لا يُحسب ملفٌّ نصيٌّ ملفَّ PNG، وقبل ذلك كي يُكشف نقلٌ يمسح البتَّ الأعلى من كلّ بايت. وإرجاعُ السطر والسطرُ الجديد يكشفان المشكلة المقابلة: فنقلٌ «متعاون» يحوّل نهاياتِ الأسطر بين المنصّات يُفسد ذلك الزوج، فيسقط الملفُّ عند البايت الخامس بدل أن يسقط في عمق الصورة. وcontrol-Z يمنع MS-DOS من سكب بقية ملفٍّ ثنائيٍّ على الطرفية حين يكتب أحدُهم type. والسطرُ الجديدُ الأخير يكشف عكسَ تحويل CR-LF.
وهنا ما فاجأنا: هذا التعليلُ ليس في المعيار الحاليّ. فـISO/IEC 15948، وهو ما يقيّس PNG اليوم، يذكر البايتات الثمانَ ويمضي، ولا يُبقي إلا جملةً واحدةً في بند التسويغ مفادُها أنّ البصمة تكشف أخطاء النقل الشائعة. أما الاستدلالُ بايتًا بايتًا فلا يبقى إلا في RFC 2083 من عام 1997 — وهي وثيقةٌ موسومةٌ بـ«إعلاميّة»، حلَّ المعيارُ محلَّها. فالبايتاتُ مُلزِمة، وأسبابُ كونها هذه البايتات ليست كذلك.
حدودٌ صريحة
البصمةُ تقول ما يدّعيه الملفُّ أنه هو، وهذا بعينه سببُ فحصها — وهو أيضًا حدُّها. فبايتاتُ المقدّمة رخيصةُ التزوير. فإن كنت تقرّر هل يُؤمَن فتحُ شيء، فبصمةٌ مطابقةٌ تقول لك إنّ الملفَّ سليمُ البنية بما يكفي ليحمل ترويسةً معقولة، ولا شيءَ غير ذلك.
وليست كلُّ بصمةٍ تبدأ من الأول. فعلامةُ ustar التي تعرّف أرشيف tar عند البايت 257، وCD001 في ISO 9660 عند البايت 32769، أي بعد أكثرَ من اثنين وثلاثين كيلوبايت. فكلُّ ما يقرأ البايتات الأربعَ الأولى وحدها يفوته أشيعُ صيغتَي أرشيفٍ وصورةِ قرص، ولهذا تقرأ هذه الأداةُ أبعد.
وصيغٌ عدّةٌ لا تُميَّز عند الترويسة، والأداةُ تقول ذلك بدل أن تخمّن. فـWebP وWAV وAVI تبدأ بالبايتات الأربع نفسِها، لأنّ ثلاثتها حاوياتُ RIFF والبايتاتُ الفاصلةُ تأتي بعد. والـ.docx و.xlsx و.jar و.apk و.epub كلُّها أرشيفات ZIP تحمل بصمة ZIP؛ وتمييزُها يقتضي فكَّ الضغط والنظرَ في الداخل، وذاك عملٌ آخر. وفي الحالين تُعرض كلُّ المطابقات بدل اختيار واحدة.
وصيغٌ كثيرةٌ بلا بصمةٍ أصلًا. فـCSV والنصُّ الصرف وأكثرُ الشِّفرة المصدرية وSVG ليست إلا حروفًا، ولا شيءَ ثابتًا في المقدّمة يُقارَن به — وSVG على وجه الخصوص XML، وقد يبدأ بإعلانٍ وقد لا يبدأ. فالملفُّ الذي لا يطابق شيئًا هنا لم يخبرك بكثير.
وأخيرًا، ثلاثٌ وثلاثون صيغةً اختيارٌ لا إحصاء، والقائمةُ محدودةٌ عن قصد. فالجوابُ الكاملُ عمليًّا هو قاعدةُ السحر المرافقةُ لأمر file في يونكس، وفيها آلافُ القواعد بمنطقٍ شرطيٍّ وحسابٍ على البايتات. وما في هذه الصفحة هو الجزءُ الذي يمكن قياسُ بايتاته على ملفٍّ حقيقيٍّ تبنيه اختباراتُ هذه الصفحة نفسُها، فكلُّ صفٍّ هنا مُتحقَّقٌ منه لا منقول.
لماذا هي مجانية؟
لأن تشغيلها لا يكلّف شيئًا. فالقائمةُ جزءٌ من الصفحة، والتعرُّفُ يجري في متصفحك: فحين تُفلِت ملفًّا لا تُقرأ إلا بايتاتُه الأولى، وتُقرأ محليًّا. لا يُرفع شيء، ولا يرى أيُّ خادمٍ ملفَّك، ولا حسابَ هناك.
والجدولُ ليس منقولًا عن جدولٍ آخر. فكلُّ صفٍّ يمكن بناؤه مقيسٌ على ملفٍّ أنتجه مُرمِّزٌ حقيقيّ، ومقابَلٌ بتعرُّف أمر file نفسِه، فخانةٌ مقلوبةٌ تكسر البناءَ بدل أن تبلغ الصفحة. وحيث تعذّر بناءُ صيغةٍ هنا تقول الصفحةُ ذلك بدل أن تتركها بلا تحقُّقٍ في صمت.