سؤال تم فتح صورة بتنسيق JPG مع المفكرة ، بلصق كل "النص" إلى ملف مفكرة جديد ، وتغييرها إلى .JPG ولم يعد مفتوحًا. لماذا ا؟


لقد تركت لي هذه الظاهرة أسئلة لطرحها.

في ما يلي التجربة المفصلة ، نظام التشغيل الخاص بي هو Windows 7 x64 SP1:

  • لقد غيرت ملف صورة (JPG) إلى TXT ببساطة عن طريق تغيير امتداده (أو يمكن للمرء فقط اختيار فتح JPG مع المفكرة ، نفس الشيء)

يجب أن يبدو مثل هذا ، متسلسلات النصوص الغريبة ، وبعضها (نادرة جدا) ذات مغزى حقيقي ، كما في الصورة أدناه "الخالق: dg-jpeg v1.0 ..."

Sample JPG text

  • لقد عطلت التفاف واخترت كل النص باستخدام Ctrl + A (للتأكد من عدم تفويت أي شيء)
  • ألصقت النص المنسوخ إلى ملف TXT آخر فارغ وحفظته بتنسيق JPG ، وقارنت حجم الملف الجديد مع JPG الأصلي. كلهم (JPG الأصلي ، ملف TXT المحول وملف TXT المنشأ حديثًا) هم من دقيق نفس الحجم ، إلى بايت.

عندما حاولت فتح ، سيقول ويندوز "يتعذر على Windows Photo Viewer فتح هذه الصورة لأن الملف يبدو تالفًا أو تالفًا أو كبيرًا جدًا".

حتى أنني حاولت اختبار ذلك باستخدام طريقة أخرى: فتحت JPG مع المفكرة ، وأنا قطعت ONE شخصية معروفة من موقع يسهل تذكره (مثل الحرف الأول من السطر الثاني) ثم احفظ الملف. سيعرض المشاهد بالطبع الرسالة نفسها. ثم فتحت مرة أخرى ولصق الحرف إلى EXACT الموقع (المفكرة يتذكر حالة الخروج مثل وضع النوافذ ، والتفاف ، وحجم الخطوط ... لذلك ليس لدي أي مشكلة في الحصول على هذا الحق)

وما زال نفس الخطأ. يمكنك محاولة هذا للحصول على هذه الفكرة ، تذكر أن تختار صورة صغيرة أخرى سوف تعمل المفكرة مثل رجل صدئ قديم.

ما كان يمكن أن يكون سبب هذه الظاهرة؟


81
2017-07-13 20:50


الأصل


جرب قيادة fc. فتح موجه كمد ويفعل C:\blah>fc file1 file2   من الممكن أن تكون الملفات بنفس الحجم ولكنها مختلفة. (على الرغم من أن بعض التغييرات العشوائية لا تميل عادةً إلى ترك ملف بنفس الحجم ، إلا أنه يمكن بسهولة). سيكون الأمر fc مفيدًا جدًا لك في التحقيق في ما يحدث. يمكنك أيضًا استخدام الأمر xxd ، وهذا في لغة cygwin ، كما يأتي مع vim7. xxd -p file1 التي سيتم تفريغ في ست عشرية من ملف. يمكنك مقارنة الست عشري للملفين مع ذلك و fc. أو حتى فتح سداسي عشرية في المفكرة والنقر بين نافذتي المفكرة مع علامة تبويب البديل. - barlop
أنت تحاول قراءة ملف ثنائي مع محرر نصوص بسيط مثل المفكرة. لن تتمكن من قراءة ترميز ANSI بشكل صحيح وبالتالي سيتم تحويله. عند حفظه ، لن يكون الملف ثنائيًا بعد ذلك ، وبالتالي لا يستطيع المحلل قراءة البيانات داخل الملف. (ابحث عن الاختلاف بين حفظ ملف يستند إلى XML وحفظ ملف ثنائي وهو موضوع مثير للاهتمام.) إذا كنت ستجرب نفس التجربة باستخدام Notepad ++ فسوف تنجح في ما كنت تحاول. - woutervs
ممكن من الازدواجية لماذا لا يظهر ملف exe كملف والأصفار في محرر نصوص مثل Notepad؟ - Horn OK Please
للمهتمين: يمكنك تحرير الصور في Vim: ومع ذلك ، فإن الخدعة هي أن Vim تقوم بتحويل الملف في XPM التنسيق ، وهو سهل ASCII. - Boldewyn
قصة قصيرة طويلة ، يقوم برنامج المفكرة بتعديل الملف الخاص بك قبل عرضه لك. - Derek 朕會功夫


الأجوبة:


اعتمادًا على التشفير المستخدم لفتح الملف ، قد ترى سلوكًا مختلفًا. يسمح لي ويندوز 7 المفكرة فتح ملف في ANSI ، UTF-8 ، يونيكود أو يونيكود الكبير.

لقد اختبرت هذه المشكلة مع صورة JPEG 2x2 بيكسل صغيرة تم إنشاؤها باستخدام gimp وفتح وحفظ ملف الصورة بترميز ANSI. فتح كل من الصورة الأصلية والمحفوظة مع محرر سداسي عشرية ألاحظ أن كل تسلسلات الـ 00 (رقمين سداسيين ، حرف تحكم NUL) تم تحويلها إلى 20 حرفًا.

يستبدل إعادة المحرر السداسي في 20 × 00 تنسيق الصورة.

لقد غوغل قليلا و لم أجد أي إشارات تشرح لماذا يفعل ذلك. فقط إشارة إلى مشاركة تحذر من ذلك (رابط مخبأ google ، الصفحة غير متوفرة).

إذا قمت بحفظ / فتح الملف باسم UTF-8 يبدو أنه لا يزال يحول أحرف NUL إلى مسافات ولكنه يزيد أيضًا حجم الملف الناتج بسبب التحويلات من الأحرف أحادية البايت إلى تسلسل UTF-8 متعدد البايتات.

إذا قمت بحفظ / فتح الملف باسم Unicode ، فإنه يبدو أنه لا يزال يحول أحرف NUL إلى مسافات ولكنه يضيف أيضًا بايتًا إلى بداية الملف ، BOM.


80
2017-07-13 23:06



0x00 هو فاصل سلسلة في سلاسل C. ربما قاموا باستبدالها نظرًا لعدم احتواء ملف نصي عليها. المفكرة هو برنامج قديم جدا. - Zonder
أشك في أن notepad.exe هو برنامج قابل للتنفيذ .NET. - knittl
Bakuriu يمكن أن توجد سلسلة C بالتأكيد في ملف ؛ يمكنني التفكير في العديد من تنسيقات الملفات التي تحتوي عليها. والأغلبية العظمى من التطبيقات التي يتم شحنها مع تطبيقات Windows هي أصلية ، وليس .NET. ومع ذلك ، لا يقوم notepad بكتابة سلاسل منتهية بقيمة خالية من الملفات. - Carey Gregory
Bakuriu: عادة ما تكون مكتوبة برامج ويندوز في صافي. انها C / C ++ والموطن في جوهره. أحد تطبيقات .Net التي طورتها مايكروسوفت كان كاتبًا حيًا تم إيقافه الآن. - Bhathiya Perera
@ SJuan76 هاه؟ لا يقوم C ++ بتعريف نوع البيانات المسمى byte. ربما كنت تفكر في لغة أخرى. ويمكن لمطوري التطبيقات التعامل مع البيانات الثنائية على أي حال يرونها مناسبة ، بما في ذلك استخدام سلاسل C إذا اختاروا ذلك. كما قلت من قبل ، يمكنني التفكير في العديد من تنسيقات الملفات الثنائية التي تحتوي على سلاسل C. - Carey Gregory


لماذا يفشل:

المفكرة خلق المساحات (ASCII code 32) شخصية لشخصيات مثل NUL  (ASCII code 0) لأن مربع نص Windows API لا يسمح إلا بإنهاء خالية char *  ASCIIZ (صفيف الشخصية ، المؤشر). يحصل على قطع في أول NUL. 

هذا يحدث ل واجهة برمجة تطبيقات Windows هو مكتوب في الغالب C اللغة و null terminated strings هي واحدة من الميزات المشتركة. حتى عندما يعتبر Windows و Unicode الحديثة يحدث نفس الصفوف المنتهية. حتى المفكرة ببساطة استبدالها بالفضاء حتى تتمكن من عرض الملف الكامل.

لذلك عند حفظ الملف تالف.

wikipedia-null terminated strings


كيفية القيام بمزيد من البحث:

يمكنك استخدام مقارنة مثل أبعد من المقارنة (تجاري ، تجريبي) لمعرفة تأثير استبدال الأحرف. انظر أيضا أدوات مقارنة ثنائية أخرى.

hex comparison

ملحوظة : (20)16 = (32)10


سبب notepad يعمل ببطء على ملفات كبيرة

 فإنه يتحقق من كل حرف واستبدال الأحرف الخاصة بمسافات. لا تقوم برامج أخرى بإجراء تحويلات في الذاكرة (على الأقل ليست بدائية كمفكرة). انهم فقط تقديم الشخصيات الخاصة بشكل مختلف. ويستخدمون تقنيات التخزين المؤقت المتقدمة.


البحث في Notepad.exe (XP 32 بت)

(أفترض أن ما زالت مكتوبة في C ++ أو على الأقل استخدام مماثل مماثل رابط )

notepad

أنا أستخدم PEiD أداة (التي توقفت عن التطوير بإدخال PE + / 64 exes)

يمكن العثور على PEiD في مجلد مجلد bin مستخرج عالمي

أنا استخرجت المفكرة. ملف ex_ من ويندوز إكس بي ايزو الواضح. حاول. انها استخراج ملف سيارة أجرة باستخدام 7Z.

تحذير ! قد يكتشف الماسح الضوئي الخاص بك الفيروسات Universal Extractor / PEiD كأدوات اختراق أو فيروسات. لا تثق به لا تنزيله!


مزيد من المعلومات حول نوافذ API

ائتمانات:جايسون سي

إنه ليس مجرد مربع النص ؛ WM_SETTEXT بشكل عام لا يوفر أي معلمة لتحديد طول السلسلة ، ويفترض دائمًا أن يتم إنهاء السلاسل عند قيمة خالية. يمكنك دائمًا إنشاء مربع نص مخصص برسالة مخصصة تحدد طول السلسلة ، ولكن Notepad ومعظم البرامج الأخرى بشكل معقول لا تفعل ذلك. أيضا وظيفة SetWindowText لا يوفر معلمة طول كذلك.


36
2017-07-14 09:59



من الغريب أن تقوم بعرض صفحة الخصائص لبرنامج المفكرة القابل للتنفيذ المجمعة مع إصدار من نظام التشغيل Windows XP ، ومع ذلك ، إذا حكمنا من خلال سمة الإطار ، فأنت تدير بوضوح بعض إصدارات Windows 8. وهذا من شأنه أن يفسر سبب ارتباط الملف التنفيذي الإصدار 7.1 من مجموعة الأدوات - هذا ما استخدموه لتجميع نظام التشغيل Windows XP والأدوات المساعدة المرتبطة به. إصدار Windows 8 من Notepad سيتم بلا شك تجميعه بإصدار أحدث من أدوات SDK. - Cody Gray
إنه ليس مجرد مربع النص ؛ WM_SETTEXTبشكل عام لا يوفر أي معلمة لتحديد طول السلسلة ، ويفترض دائمًا أن يتم إنهاء السلاسل عند قيمة خالية. يمكنك دائمًا إنشاء مربع نص مخصص برسالة مخصصة تحدد طول السلسلة ، ولكن Notepad ومعظم البرامج الأخرى بشكل معقول لا تفعل ذلك. - Jason C
BhathiyaPerera لأنني راضٍ عن مستوى العمل الذي قمت به عن طريق إضافة معلومات في تعليق. نرحب بك لتحسين إجابتك بهذه المعلومات إذا كنت ترغب في ذلك. - Jason C


لا يحتفظ المفكرة كافة الأحرف الخاصة / الموسعة تماماً كما هي. ليس لدي مرجع لهذا السلوك على الفور في متناول اليد ولكن وجدت هذه الحالة على سبيل المثال بنهاية السطر LF بنمط UNIX الذي سوف يقوم المفكرة بتحويله إلى CRLF والقيمة الخالية (0x00) التي سيتجاهلها. في ملف ثنائي مثل JPG ، يكون هناك تواجد عشوائي للحرف (الأحرف) الذي لا يحتفظ به المفكرة. جرب تجربتك مع محرر HEX-aware ويجب أن تعمل بعد ذلك. سأقوم بتحديث إجابتي إذا وجدت مرجعًا جيدًا وبمجرد اختبار محرر HEX.

تحديث: جربت بضعة محررات مبرمجين معروفين ، لكن واحدًا منهم فقط عمل على الفور HxD by Maël Hörz. لم أستخدم أبداً HxD من قبل ولكن وجدته بفضل إجابة على مقالة المكدس هذه ، البرنامج المساعد عارض / محرر عرافة للمفكرة ++.

المحررين الآخرين الذين لم يعملوا بعد بضع دقائق من الجهد كانوا Notepad ++ و Notepad2 و UltraEdit (v17.3 ، الإصدار الأقدم). وكان اثنان من هذه المشاكل مع نسخ / لصق من وحدات البايت القليلة الأولى ، و JPEG ملف التوقيع رقم السحر FF D8 FF. ربما سيعملون مع تافه أكثر مما لدي وقت في الوقت الحاضر.


28
2017-07-13 21:49



يفتح النص الثانوي (2/3) تلقائيًا ملفًا ثنائيًا عن طريق إظهاره بتنسيق سداسي عشرية. على سبيل المثال ، بداية ملف JPEG بمجرد النقر فوق "فتح": puu.sh/aaAVx/bd08dab46e.png - tomsmeding
في الواقع ، في أغلب الأحيان أكثر من المفكرة سوف يحول LF إلى CRLF ، فإنه سيترك LF على ما هو عليه ويعرض النص كما لو لم يكن هناك فاصل أسطر على الإطلاق! - Moshe Katz


لقد اعتدت أن تكون قادرًا على القيام بذلك من خلال الكتابة مرة أخرى في اليوم. كان برنامجًا قياسيًا في Windows 3.1 ولكن لا أتذكر إذا كان نظام التشغيل Windows 95 يحتوي عليه. ستسمح الكتابة بتحرير ثنائي آمن لأي ملف يمكن فتحه (من المحتمل أن يكون حجم الملف محدودًا جدًا). من المؤكد أن Notepad ليس آمنًا ثنائيًا (يبقى النص كما هو ، ولكن قد تتغير وحدات البايت الفعلية للأحرف غير النصية [مثل شفرات التحكم]) وهذا هو سبب عدم عمل مثال JPG الخاص بك. حاول الحصول على نسخة من الكتابة (والنوافذ القديمة جدًا) وجرّب تجربتك مرة أخرى!

بالنسبة الى Wikipedia في "كتابة ويندوز" المادة تم تضمين الكتابة حتى Windows NT 3.5. تم استبداله في Wordpad في نظام التشغيل Windows 95 فصاعداً. write.exe كان لا يزال موجودا في دليل ويندوز ولكن كان مجرد غلاف لافتتاح الدفتر.


6
2017-07-14 06:54





أظن أنها ليست مشكلة تشفير ، بل مشكلة شخصية. تنسيق JPG هو في الأساس تيار بايت. مما يسمح بالحروف غير القابلة للطباعة مثل NUL و ETX و STX و SOH و DLE ، إلخ.

يتعذر على Microsoft Notepad عرض تلك الأحرف غير القابلة للطباعة. قد تعرض العناصر النائبة من نوع ما مثل مساحة لحرف خالية. لذا فإن فتح الملف باستخدام برنامج "المفكرة" لا يُظهر المحتوى الفعلي ولكن المحتوى تم فك ترميزه بواسطة الترميز المحدد (utf-8 ، utf-16 ، إلخ) وعرضه بواسطة مجموعة أحرف معينة (unicode ، ascii ، إلخ) باستثناء غير أحرف قابلة للطباعة.

عند تحديد كل النص المعروض ونسخ النص إلى الحافظة ، يمكنك فقط نسخ الأحرف القابلة للطباعة بما في ذلك العناصر النائبة. وبالتالي تحويل الأحرف الفارغة إلى مسافات وتجاهل الأحرف الأخرى غير القابلة للطباعة بشكل كامل.

إذاً ، في الأساس ، تخسر محتوى يفعل ذلك بهذه الطريقة. إذا كنت تستخدم محررًا سداسيًا عشريًا بدلاً من ذلك ، فسيتم نسخ المحتوى بالكامل.


تحديث: الجواب Bhathiya Pereras هو الصحيح: https://superuser.com/a/782885/322784 لا يتم تجاهل الأحرف غير القابلة للطباعة عند نسخ النص إلى الحافظة.


5
2017-07-14 09:00



كل ملف هو "أساسا دفق بايت". - Jason C
JasonC أنا لا أوافق. بينما يمكن قراءة كل ملف كدفق بايت. لا يمكن قراءة الملفات المنظمة مثل ملفات XML كدفق من البيانات. لن يكون المحتوى صالحًا حتى تتم قراءة نهاية الملف. لا يزال هناك نقص في نصف JPG ويمكن عرضه. انها مجرد نصف الصورة. - sbecker
ليس هناك مجال للاختلافات في ذلك. :) XML هو دفق بايت مثل أي شيء آخر ، ويعرف XML (مع ترميز الأحرف) تنسيقًا لتلك البايتات. ومن المؤكد أنه يمكن قراءته كدفق من البيانات. فتحه في محرر سداسي عشرية ، على سبيل المثال. يحدث هذا التدفق من البيانات ليكون paseable مثل XML. - Jason C
JasonC لا يمكن أن يجادل في الواقع. :) توشي! - sbecker


يحتوي ملف JPEG على بيانات غير نصية باستثناء بعض الحقول ، بشكل أساسي سيتم العثور على أي قيم بايت بين 0 و 255 ، خاصة في المساحة التي تمثل الصورة المضغوطة المشفرة التي تحتوي على بيانات شبه مزيفة تقريبًا.

ولكن سيقوم المفكرة بمعالجة البيانات كنص ANSI بشكل افتراضي ، لذلك سوف يقوم بأشياء مختلفة من شأنها أن تغير البيانات الأصلية ، على النحو التالي:

  • استبدال البايتات تعيين أحرف خاصة / غير معرفة / ممنوع لأنها لا معنى لنص ANSI صالح

  • إعادة ترميز أحرف فارغة ، نهاية السطر وتنتهي نهاية الملف إلى اتفاقيات ويندوز / دوس

وهو ما يعني أنه إذا قمت بتحرير البيانات وحفظها كنص ، فسيؤدي ذلك إلى تغيير jpeg في أفضل الحالات ، وجعلها غير قابلة للاستخدام في أسوأ الأحوال.


2
2017-07-14 13:16



"ANSI" غير صحيح تقنيًا، على الرغم من أنه من المفهوم بشكل عام. - Jason C