नोटपैड के साथ एक JPG तस्वीर को खोला, सभी "टेक्स्ट" को एक नए नोटपैड फ़ाइल में पेस्ट किया, .JPG में बदल गया और यह अब नहीं खुलता है। क्यों?


82

यह घटना मुझे पूछने के लिए सवाल छोड़ रही है।

यहाँ विस्तृत प्रयोग है, मेरा OS विंडोज 7 x64 SP1 है:

  • मैंने केवल इसके विस्तार को बदलकर TXT के लिए एक तस्वीर (JPG) फ़ाइल बदल दी है (या कोई नोटपैड, उसी चीज़ के साथ JPG को खोलने के लिए चुन सकता है)

यह इस तरह दिखना चाहिए, अजीब तरह से ग्रंथों के दृश्यों को देख रहा है, और उनमें से कुछ (बहुत दुर्लभ) वास्तव में सार्थक हैं, जैसे नीचे दिए गए स्क्रीनशॉट में "निर्माता: डीजी-जेपीईजी v1.0 ..."

नमूना JPG पाठ

  • मैंने Ctrl + A का उपयोग करके सभी पाठों को रैप करने और चयनित करने में अक्षम किया (यह सुनिश्चित करने के लिए कि कुछ भी याद नहीं है)
  • मैंने कॉपी किए गए पाठ को एक और रिक्त TXT फ़ाइल में चिपकाया और इसे JPG के रूप में सहेजा, मैंने मूल JPG के साथ नए फ़ाइल आकार की तुलना की। वे सभी (मूल JPG, परिवर्तित TXT फ़ाइल और नई बनाई गई TXT फ़ाइल) बाइट्स के समान सटीक आकार के हैं।

जब मैंने खोलने की कोशिश की, तो विंडोज कहेगा "विंडोज फोटो व्यूअर इस तस्वीर को नहीं खोल सकता क्योंकि फाइल क्षतिग्रस्त, दूषित, या बहुत बड़ी प्रतीत होती है"

मैंने इसे एक अन्य विधि का उपयोग करके परीक्षण करने का भी प्रयास किया: जेपीजी को नोटपैड के साथ खोला, मैंने एक ज्ञात चरित्र को याद करने के लिए आसान स्थान से काटा (दूसरी पंक्ति के पहले चरित्र की तरह) फिर फ़ाइल को सहेजें। दर्शक निश्चित रूप से एक ही संदेश प्रदर्शित करेगा। तब मैंने इसे फिर से खोला और चरित्र को EXACT स्थान पर पेस्ट कर दिया (नोटपैड ने अपनी निकास स्थिति को याद किया जैसे कि विंडोज़ की स्थिति, रैपिंग, फोंट का आकार ... इसलिए मुझे यह अधिकार प्राप्त करने में कोई समस्या नहीं है)

और अभी भी वही त्रुटि है। आप इस विचार को प्राप्त करने के लिए कोशिश कर सकते हैं, एक छोटी सी तस्वीर चुनने के लिए याद रखें नोटपैड एक पुराने जंग खाए आदमी की तरह काम करेगा।

इस घटना का कारण क्या हो सकता है?


4
एफसी कमांड का प्रयास करें। एक cmd प्रॉम्प्ट खोलें और करें- C:\blah>fc file1 file2 फाइलों का आकार एक जैसा होना संभव है लेकिन अलग-अलग। (हालांकि आमतौर पर कुछ यादृच्छिक परिवर्तन एक फ़ाइल को एक ही आकार छोड़ने की प्रवृत्ति नहीं होती है लेकिन यह आसानी से हो सकती है)। क्या हो रहा है, इसकी जांच में fc कमांड आपके लिए बहुत उपयोगी होगी। आप xxd कमांड का उपयोग भी कर सकते हैं, यह साइबरविन में है, और vim7 के साथ भी आता है। xxd -p file1 जो किसी फ़ाइल के हेक्स को डंप करेगा। आप दो फ़ाइलों की हेक्स की तुलना उस और fc से कर सकते हैं। या यहां तक ​​कि नोटपैड में हेक्स खोलें और ऑल्ट-टैब के साथ दो नोटपैड विंडो के बीच फ्लिक करें।
बार्लोप ११:१४ में

22
आप एक साधारण पाठ संपादक के साथ बाइनरी फ़ाइल पढ़ने की कोशिश कर रहे हैं जैसे नोटपैड। यह एएनएसआई एन्कोडिंग को सही ढंग से नहीं पढ़ पाएगा और इस प्रकार यह इसे रूपांतरित कर देगा। जब आप इसे सहेजते हैं तो फ़ाइल अब बाइनरी नहीं होगी और इस तरह पार्सर फ़ाइल के अंदर डेटा को नहीं पढ़ सकता है। (XML आधारित फ़ाइल बचत और बाइनरी फ़ाइल सेविंग के बीच अंतर को देखें यह एक दिलचस्प विषय है।) यदि आप नोटपैड ++ के साथ एक ही प्रयोग की कोशिश करेंगे, तो आप उस चीज़ में सफल होंगे जो आप कोशिश कर रहे थे।
woutervs


3
रुचि के लिए: आप विम में छवियों को संपादित कर सकते हैं: हालांकि, चाल यह है कि विम एक्सपीएम प्रारूप में फ़ाइल को धर्मान्तरित करता है , जो सादे ASCII है।
बोल्ड्यूविन

4
लंबी कहानी, नोटपैड आपको प्रदर्शित करने से पहले आपकी फ़ाइल को संशोधित करता है।
डेरेक 會 會

जवाबों:


81

फ़ाइल को खोलने के लिए उपयोग किए गए एन्कोडिंग के आधार पर आप भिन्न व्यवहार देख सकते हैं। मेरा विंडोज 7 नोटपैड ANSI, UTF-8, यूनिकोड या यूनिकोड बड़े एंडियन में एक फ़ाइल खोलने की अनुमति देता है।

मैंने इस मुद्दे को एक छोटे 2x2 पिक्सेल जेपीईजी इमेज के साथ तैयार किया है जो जिम्प के साथ बनाया गया है और एएनएसआई एन्कोडिंग के साथ छवि फ़ाइल को खोलना और सहेजना है। हेक्स संपादक के साथ मूल और सहेजी गई छवि दोनों को खोलकर मैं देखता हूं कि सभी 00 अनुक्रम (दो हेक्स अंक, एनयूएल नियंत्रण चरित्र ) को 20 (अंतरिक्ष चरित्र) में बदल दिया गया है।

हेक्स संपादक में सभी 20 को 00 से बदलकर छवि प्रारूप को पुनर्स्थापित करता है।

मैंने इसे थोड़ा सा नापा है और मुझे ऐसा कोई संदर्भ नहीं मिला जो यह समझाता हो कि यह ऐसा क्यों करता है। केवल एक पोस्ट का संदर्भ जो इसके बारे में चेतावनी देता है (Google कैश लिंक, पेज उपलब्ध नहीं है)।

यदि आप फ़ाइल को UTF-8 के रूप में सहेजते / खोलते हैं, तो ऐसा लगता है कि यह अभी भी NUL वर्णों को रिक्त स्थान में परिवर्तित करता है, लेकिन यह एकल-बाइट वर्णों से UTF-8 बहु-बाइट अनुक्रमों के रूपांतरण के कारण परिणामी फ़ाइल आकार को भी बढ़ाता है।

यदि आप फ़ाइल को यूनिकोड के रूप में सहेजते / खोलते हैं, तो ऐसा लगता है कि यह अभी भी NUL वर्णों को रिक्त स्थान में परिवर्तित करता है, लेकिन फ़ाइल की शुरुआत में एक बाइट भी जोड़ता है, BOM


22
0x00 C स्ट्रिंग्स में एक स्ट्रिंग टर्मिनेटर है। हो सकता है कि उन्होंने उन्हें प्रतिस्थापित कर दिया हो क्योंकि टेक्स्ट फ़ाइल में उन्हें नहीं होना चाहिए। नोटपैड एक बहुत पुराना कार्यक्रम है।
ज़ोनडर

25
मुझे संदेह है कि notepad.exe एक .NET निष्पादन योग्य है।
नाइट जू

10
@ बकुरी एसी स्ट्रिंग सबसे निश्चित रूप से एक फ़ाइल में मौजूद हो सकती है; मैं कई फ़ाइल स्वरूपों के बारे में सोच सकता हूं जिनमें वे शामिल हैं। और विंडोज़ ऐप के साथ जहाज बनाने वाले अधिकांश एप्लिकेशन नेटिव नहीं हैं। उस ने कहा, नोटपैड फ़ाइलों को अशक्त-समाप्त तार नहीं लिखता है।
कैरी ग्रेगोरी

4
@ बकुरीउ: विंडोज प्रोग्राम आमतौर पर .Net में नहीं लिखे जाते हैं। यह C / C ++ है और मूल में मूल है। Microsoft द्वारा विकसित .Net अनुप्रयोगों में से एक लाइव लेखक था जिसे अब बंद कर दिया गया है।
भाथिया-परेरा

5
@ SJuan76 हुह? C ++ नाम के डेटा प्रकार को परिभाषित नहीं करता है byte। शायद आप किसी और भाषा के बारे में सोच रहे हैं। और एप्लिकेशन डेवलपर्स द्विआधारी डेटा से निपट सकते हैं, हालांकि वे फिट देखते हैं, जिसमें सी स्ट्रिंग्स का उपयोग भी शामिल है यदि वे ऐसा चुनते हैं। जैसा कि मैंने पहले कहा था, मैं कई बाइनरी फ़ाइल स्वरूपों के बारे में सोच सकता हूं जिनमें सी स्ट्रिंग शामिल हैं।
कैरी ग्रेगरी

37

यह विफल क्यों होता है:

नोटपैड एनयूएल(ASCII code 32) जैसे पात्रों के लिए रिक्त स्थान चरित्र बनाता है क्योंकि विंडोज एपीआई का पाठ बॉक्स केवल ASCIIZ (चरित्र सरणी, सूचक) को समाप्त करने की अनुमति देता है । यह पहले NUL में कट जाता है। (ASCII code 0)char *

ऐसा इसलिए होता है क्योंकि विंडोज एपीआई ज्यादातर सी भाषा में लिखा जाता है और अशक्त समाप्त होने वाले तार सामान्य विशेषताओं में से एक हैं। यहां तक ​​कि जब आधुनिक विंडोज और यूनिकोड को एक ही माना जाता है, तो शून्य से समाप्त होने वाले तार होते हैं। तो नोटपैड बस उन्हें अंतरिक्ष से बदल देता है ताकि आप पूरी फ़ाइल देख सकें।

तो जब आप फ़ाइल को सहेजते हैं तो यह दूषित हो जाता है।

विकिपीडिया-शून्य समाप्त तार


कैसे करें आगे का शोध:

आप चरित्र प्रतिस्थापन प्रभाव को देखने के लिए तुलना (वाणिज्यिक, परीक्षण) से परे एक तुलनित्र का उपयोग कर सकते हैं । अन्य बाइनरी तुलना टूल भी देखें ।

हेक्स तुलना

नोट : (२०) १६ = (३२) १०


नोटपैड का कारण बड़ी फ़ाइलों पर धीरे-धीरे कार्य करता है

यह प्रत्येक वर्ण की जाँच करता है और विशेष वर्णों को रिक्त स्थान से प्रतिस्थापित करता है। अन्य सॉफ़्टवेयर इन-मेमोरी रूपांतरण (कम से कम आदिम नहीं नोटपैड के रूप में) नहीं करते हैं। वे सिर्फ विशेष पात्रों को अलग तरीके से प्रस्तुत करते हैं। और वे उन्नत बफरिंग तकनीकों का उपयोग करते हैं।


Notepad.exe (XP 32 बिट) में देख रहे हैं

(मुझे लगता है कि यह अभी भी सी ++ में लिखा है या कम से कम एक समान समान लिंकर का उपयोग करें )

नोटपैड

मैं PEiD टूल का उपयोग कर रहा हूं (जिसमें PE + / 64 exes की शुरूआत के साथ विकास बंद हो गया है)

PEID को यूनिवर्सल एक्सट्रैक्टर के बिन फ़ोल्डर में बंडल किया जा सकता है

मैंने नोटपैड निकाला। स्पष्ट रूप से Windows XP iso से ex_ फ़ाइल। कोशिश करके देखो। यह 7z का उपयोग करके एक कैब फ़ाइल एक्सट्रैक्ट है।

चेतावनी! आपके वायरस स्कैनर यूनिवर्सल एक्सट्रैक्टर / PEiD को हैक टूल या वायरस के रूप में पहचान सकते हैं। भरोसा मत करो इसे डाउनलोड न करें !!


विंडोज़ एपीआई के बारे में अधिक जानकारी

क्रेडिट: जेसन सी

यह सिर्फ टेक्स्ट बॉक्स नहीं है; WM_SETTEXT सामान्य रूप से स्ट्रिंग की लंबाई को निर्दिष्ट करने के लिए कोई पैरामीटर नहीं देता है, और तारों को हमेशा शून्य पर समाप्त करने के लिए माना जाता है। आप हमेशा एक कस्टम संदेश के साथ एक कस्टम टेक्स्ट बॉक्स बना सकते हैं जिसमें स्ट्रिंग की लंबाई निर्दिष्ट होती है, लेकिन नोटपैड और अधिकांश अन्य कार्यक्रम यथोचित नहीं होते हैं। साथ ही फ़ंक्शन SetWindowText लंबाई पैरामीटर भी प्रदान नहीं करता है।


1
यह थोड़ा अजीब है कि आप विंडोज एक्सपी के एक संस्करण के साथ बंडल नोटपैड निष्पादन योग्य के लिए संपत्ति शीट दिखाते हैं, फिर भी खिड़की के विषय को देखते हुए, आप स्पष्ट रूप से विंडोज 8 के कुछ संस्करण चला रहे हैं। यह बताएगा कि निष्पादन योग्य के साथ क्यों जोड़ा गया था टूलसेट का संस्करण 7.1- यही कि वे विंडोज एक्सपी और संबंधित उपयोगिताओं का संकलन करते थे। नोटपैड का विंडोज 8 संस्करण निस्संदेह एसडीके टूल के नए संस्करण के साथ संकलित किया जाएगा।
कोडी ग्रे

2
यह सिर्फ टेक्स्ट बॉक्स नहीं है; WM_SETTEXTसामान्य तौर पर स्ट्रिंग की लंबाई को निर्दिष्ट करने के लिए कोई पैरामीटर नहीं होता है, और तारों को हमेशा शून्य पर समाप्त करने के लिए माना जाता है। आप हमेशा एक कस्टम संदेश के साथ एक कस्टम टेक्स्ट बॉक्स बना सकते हैं जिसमें स्ट्रिंग की लंबाई निर्दिष्ट होती है, लेकिन नोटपैड और अधिकांश अन्य कार्यक्रम यथोचित नहीं होते हैं।
जेसन सी

@BhathiyaPerera क्योंकि मैं एक टिप्पणी में जानकारी जोड़कर जो काम किया है उसके स्तर से संतुष्ट हूं। यदि आप चाहें तो उस जानकारी के साथ अपने उत्तर को बेहतर बनाने के लिए आपका स्वागत है।
जेसन सी

28

नोटपैड सभी विशेष / विस्तारित पात्रों को ठीक वैसे ही संरक्षित नहीं करता है जैसे वे हैं। मेरे पास इस व्यवहार के लिए तुरंत कोई संदर्भ नहीं है, लेकिन उदाहरण के लिए लाइन LF के UNIX- शैली अंत के साथ ऐसा होना पाया गया है जिसे नोटपैड CRLF और null (0x00) में परिवर्तित कर देगा जिसे वह अनदेखा कर देगा। एक JPG जैसे एक द्विआधारी फ़ाइल में चरित्र (एस) के यादृच्छिक घटना होने के लिए उत्तरदायी हैं जिन्हें नोटपैड संरक्षित नहीं करता है। हेक्स-जागरूक संपादक के साथ अपने प्रयोग की कोशिश करें और इसे तब काम करना चाहिए। यदि मुझे एक अच्छा संदर्भ मिलता है और मैंने एक बार हेक्स संपादक का परीक्षण किया है, तो मैं अपना उत्तर अपडेट करूंगा।

अपडेट: मैंने कुछ जाने-माने प्रोग्रामर्स संपादकों की कोशिश की, लेकिन उनमें से केवल एक ने बल्ले से सही काम किया, HxD Maël Törz द्वारा । मैंने पहले कभी भी एचएक्सडी का इस्तेमाल नहीं किया था, लेकिन इस स्टैक लेख के जवाब के लिए धन्यवाद मिला, नोटपैड ++ के लिए एक हेक्स दर्शक / संपादक प्लगइन

अन्य संपादक जो कुछ मिनट के प्रयास के बाद काम नहीं करते थे, वे नोटपैड ++, नोटपैड 2 और अल्ट्राएडिट (वी 17.3, पुराने संस्करण) थे। इनमें से कुछ को पहले कुछ बाइट्स की कॉपी / पेस्ट, जेपीईजी फाइल सिग्नेचर मैजिक नंबर एफएफ डी 8 एफएफ के साथ समस्या थी। हो सकता है कि वे वर्तमान में मेरे पास जितना समय लगाते हैं, उससे कहीं अधिक थोड़े-थोड़े परिश्रम के साथ काम करेंगे।


उदात्त पाठ (2/3) स्वचालित रूप से हेक्स प्रारूप में दिखाकर एक बाइनरी फ़ाइल खोलता है। उदाहरण के लिए, बस पर क्लिक "खुला" द्वारा JPEG फ़ाइल की शुरुआत: puu.sh/aaAVx/bd08dab46e.png
tomsmeding

3
दरअसल, नोटपैड से अधिक बार LF को CRLF में बदल देगा, यह LF को उसी तरह छोड़ देगा और पाठ प्रदर्शित करेगा जैसे कि कोई लाइन ब्रेक नहीं था!
मोशे काट्ज़

6

आप दिन में वापस लिखें के साथ ऐसा करने में सक्षम थे। यह विंडोज 3.1 में एक मानक कार्यक्रम था, लेकिन मुझे याद नहीं है कि क्या विंडोज 95 इसमें शामिल है। लिखने से किसी भी फ़ाइल का बाइनरी सुरक्षित संपादन हो सकता है जो इसे खोल सकता है (शायद बहुत सीमित फ़ाइल आकार)। नोटपैड निश्चित रूप से द्विआधारी सुरक्षित नहीं है (पाठ समान रहता है लेकिन गैर-पाठ वर्णों के वास्तविक बाइट्स [जैसे नियंत्रण कोड] बदल सकते हैं) यही वजह है कि आपका जेपीजी उदाहरण काम नहीं कर रहा है। लिखने की एक प्रतिलिपि प्राप्त करने का प्रयास करें (और बहुत पुराना विंडोज) और अपने प्रयोग को फिर से आज़माएं!

के अनुसार विकिपीडिया के "विंडोज लिखें" लेख लिखें Windows NT 3.5 अप करने के लिए शामिल किया गया था। इसे विंडोज 95 में वर्डपैड द्वारा बदल दिया गया था। write.exeअभी भी विंडोज डायरेक्टरी में मौजूद था लेकिन वर्डपैड खोलने के लिए बस एक रैपर था।


5

मुझे लगता है कि यह एन्कोडिंग की समस्या नहीं है, बल्कि चरित्र सेट की भी है। जेपीजी प्रारूप मूल रूप से एक बाइट स्ट्रीम है। इस प्रकार गैर-प्रिंट करने योग्य वर्ण जैसे NUL, ETX, STX, SOH, DLE, इत्यादि।

Microsoft नोटपैड उन गैर-मुद्रण योग्य वर्णों को प्रदर्शित नहीं कर सकता है। यह किसी प्रकार के प्लेसहोल्डर को एक अशक्त चरित्र के लिए एक स्थान की तरह प्रदर्शित कर सकता है। इसलिए नोटपैड के साथ फ़ाइल खोलने से वास्तविक सामग्री नहीं दिखाई देती है, लेकिन चयनित एन्कोडिंग (utf-8, utf-16, आदि) द्वारा डिकोड की गई सामग्री और गैर-वर्ण को छोड़कर एक निश्चित वर्ण सेट (यूनिकोड, एससीआई, आदि) द्वारा प्रदर्शित की जाती है। मुद्रण योग्य वर्ण।

सभी प्रदर्शित पाठ का चयन करते समय और पाठ को क्लिपबोर्ड पर कॉपी करते हुए, आप केवल प्लेसहोल्डर्स सहित मुद्रण योग्य वर्णों की प्रतिलिपि बनाते हैं। इस प्रकार स्वचालित रूप से रिक्त वर्णों को रिक्त स्थान में परिवर्तित करना और अन्य गैर-मुद्रण योग्य वर्णों को पूरी तरह से अनदेखा करना।

तो मूल रूप से आप सिर्फ इस तरह से सामग्री खो देते हैं। यदि आप इसके बजाय एक हेक्स-संपादक का उपयोग करते हैं, तो यह पूरी तरह से सभी सामग्री की नकल करेगा।


अपडेट: भठिया पेररस का उत्तर सही है: https://superuser.com/a/782885/322784 क्लिपबोर्ड पर पाठ की प्रतिलिपि बनाते समय गैर-मुद्रण योग्य वर्णों को अनदेखा नहीं किया जाता है।


हर फाइल "मूल रूप से एक बाइट स्ट्रीम" है।
जेसन सी

1
@JasonC मैं असहमत होगा। जबकि हर फाइल को बाइट स्ट्रीम के रूप में पढ़ा जा सकता है। XML फ़ाइलों की तरह संरचित फ़ाइलें डेटा की एक धारा के रूप में पढ़ने योग्य नहीं हैं। सामग्री तब तक मान्य नहीं होगी जब तक कि फ़ाइल का अंत नहीं पढ़ा गया हो। आधा jpg में एक कट अभी भी मान्य है और प्रदर्शित किया जा सकता है। यह सिर्फ आधी तस्वीर गायब है।
सक्बकार

उस पर असहमति के लिए वास्तव में कोई जगह नहीं है। :) XML कुछ और की तरह बाइट्स की एक धारा है, और XML (चरित्र एन्कोडिंग के साथ) उन बाइट्स के लिए एक प्रारूप को परिभाषित करता है। यह निश्चित रूप से डेटा की एक धारा के रूप में पठनीय है। इसे एक हेक्स संपादक में खोलें, उदाहरण के लिए। डेटा की वह धारा सिर्फ XML के रूप में पार्स करने योग्य होती है।
जेसन सी

@JasonC वास्तव में इसके साथ बहस नहीं कर सकता। :) टच!
सोबकर

2

जेपीईजी फ़ाइल में कुछ क्षेत्रों को छोड़कर गैर पाठ डेटा शामिल हैं, मूल रूप से 0 और 255 के बीच कोई भी बाइट मान पाए जाएंगे, विशेष रूप से एन्कोडेड संपीड़ित छवि का प्रतिनिधित्व करने वाले क्षेत्र में जिसमें लगभग छद्म आयामी डेटा होता है।

लेकिन नोटपैड डिफ़ॉल्ट रूप से डेटा को एएनएसआई पाठ के रूप में मानेगा, इसलिए यह विभिन्न चीजें करेगा जो मूल डेटा को बदल देगा, जैसे:

  • बाइट्स मैपिंग विशेष / अपरिभाषित / निषिद्ध वर्णों को बदलें क्योंकि वे एक मान्य एएनएसआई पाठ के लिए कोई मतलब नहीं रखते हैं

  • Windows और DOS सम्मेलनों के लिए फ़ाइल वर्णों के अंत और अंत के अंत में रिक्त वर्ण, सांकेतिक शब्दों में बदलना

जिसका अर्थ है कि यदि आप डेटा को टेक्स्ट के रूप में संपादित करते हैं और सहेजते हैं तो यह jpeg को सर्वोत्तम स्थिति में बदल देगा, और इसे सबसे खराब में अनुपयोगी बना देगा।


"एएनएसआई" तकनीकी रूप से सही नहीं है , हालांकि इसे आमतौर पर समझा जाता है।
जेसन सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.