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


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

यहां विस्तृत प्रयोग है, मेरा ओएस विंडोज 7 x64 एसपी 1 है:

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

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

Sample JPG text

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

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

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

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

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


81
2017-07-13 20:50


मूल


एफसी कमांड का प्रयास करें। एक cmd प्रॉम्प्ट खोलें और करें- C:\blah>fc file1 file2   फाइलों के लिए एक ही आकार होना संभव है लेकिन अलग है। (हालांकि आमतौर पर कुछ यादृच्छिक परिवर्तन फ़ाइल को एक ही आकार में नहीं छोड़ते हैं लेकिन यह आसानी से कर सकता है)। क्या हो रहा है इसकी जांच में एफसी कमांड आपके लिए बहुत उपयोगी होगा। आप xxd कमांड का भी उपयोग कर सकते हैं, यह साइगविन में है, और यह भी vim7 के साथ आता है। xxd -p file1 जो फ़ाइल के हेक्स को डंप करेगा। आप उस और एफसी के साथ दो फाइलों के हेक्स की तुलना कर सकते हैं। या नोटपैड में हेक्स भी खोलें और ऑल्ट-टैब वाली दो नोटपैड विंडो के बीच फ्लिक करें। - barlop
आप नोटपैड जैसे साधारण टेक्स्ट एडिटर के साथ एक बाइनरी फ़ाइल पढ़ने की कोशिश कर रहे हैं। यह एएनएसआई एन्कोडिंग को सही ढंग से पढ़ने में सक्षम नहीं होगा और इस प्रकार यह इसे परिवर्तित करेगा। जब आप इसे सहेजते हैं तो फ़ाइल अब बाइनरी नहीं होगी और इस प्रकार पार्सर फ़ाइल के अंदर डेटा नहीं पढ़ सकता है। (एक्सएमएल आधारित फ़ाइल की बचत और बाइनरी फ़ाइल को सहेजने के बीच अंतर को देखना एक दिलचस्प विषय है।) यदि आप नोटपैड ++ के साथ एक ही प्रयोग का प्रयास करेंगे तो आप जो भी कोशिश कर रहे थे उसमें सफल होंगे। - woutervs
के संभावित डुप्लिकेट नोटपैड जैसे पाठ संपादक में एक exe फ़ाइल क्यों नहीं है और शून्य के रूप में दिखाई देती है? - Horn OK Please
रुचि के लिए: आप विम में छवियों को संपादित कर सकते हैं: हालांकि, यह चाल है कि विम फ़ाइल को परिवर्तित करता है XPM प्रारूप, जो सादा ASCII है। - Boldewyn
लंबी कहानी छोटी, नोटपैड इसे आपके सामने प्रदर्शित करने से पहले आपकी फ़ाइल को संशोधित करती है। - Derek 朕會功夫


जवाब:


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

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

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

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

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

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


80
2017-07-13 23:06



0x00 सी तारों में एक स्ट्रिंग टर्मिनेटर है। वे उन्हें बदल सकते हैं क्योंकि टेक्स्ट फ़ाइल में उन्हें शामिल नहीं होना चाहिए। नोटपैड एक बहुत पुराना कार्यक्रम है। - Zonder
मुझे संदेह है कि notepad.exe एक .NET निष्पादन योग्य है। - knittl
@ बाकुरीयू ए सी स्ट्रिंग निश्चित रूप से एक फाइल में मौजूद हो सकती है; मैं उन कई फ़ाइल स्वरूपों के बारे में सोच सकता हूं जिनमें उन्हें शामिल किया गया है। और विंडोज़ ऐप्स के साथ जहाज वाले विशाल बहुमत देशी हैं, न कि .NET। उस ने कहा, नोटपैड फ़ाइलों को शून्य-समाप्त तार नहीं लिखता है। - Carey Gregory
@ बाकुरी: विंडोज प्रोग्राम आमतौर पर नेट में नहीं लिखे जाते हैं। यह कोर पर सी / सी ++ और मूल है। माइक्रोसॉफ्ट द्वारा विकसित नेट अनुप्रयोगों में से एक लाइव लेखक था जो अब बंद हो गया है। - Bhathiya Perera
@ एसजेआन 76 हू? सी ++ नामित डेटा प्रकार को परिभाषित नहीं करता है byte। शायद आप किसी अन्य भाषा के बारे में सोच रहे हैं। और एप्लिकेशन डेवलपर बाइनरी डेटा से निपट सकते हैं हालांकि वे फिट दिखाई देते हैं, सी सी स्ट्रिंग्स के उपयोग सहित, यदि वे चुनते हैं। जैसा कि मैंने पहले कहा था, मैं कई बाइनरी फ़ाइल स्वरूपों के बारे में सोच सकता हूं जिनमें सी स्ट्रिंग्स शामिल हैं। - Carey Gregory


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

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

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

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

विकिपीडिया-नल समाप्त तारों


आगे अनुसंधान कैसे करें:

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

hex comparison

ध्यान दें : (20)16 = (32)10


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

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


Notepad.exe में देख रहे हैं (एक्सपी 32 बिट)

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

notepad

मैं इसका उपयोग कर रहा हूँ PEiD टूल (जिसने पीई + / 64 एक्सईएस के परिचय के साथ विकास को रोक दिया)

पीईआईडी को बिन फ़ोल्डर में बंडल किया जा सकता है सार्वभौमिक निकालने वाला

मैंने नोटपैड निकाला। विंडोज एक्सपी आईएसओ से ex_ फ़ाइल स्पष्ट रूप से। कोशिश करके देखो। यह 7z का उपयोग कर एक कैब फ़ाइल निकालने है।

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


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

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

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


36
2017-07-14 09:59



यह थोड़ा अजीब बात है कि आप Windows XP के संस्करण के साथ बंडल किए गए नोटपैड निष्पादन योग्य के लिए प्रॉपर्टी शीट दिखाते हैं, फिर भी विंडो थीम द्वारा निर्णय लेते हुए, आप स्पष्ट रूप से विंडोज 8 के कुछ संस्करण चला रहे हैं। यह समझाएगा कि निष्पादन योग्य क्यों लिंक किया गया था टूलसेट का संस्करण 7.1- यही वह है जो वे विंडोज एक्सपी और संबंधित उपयोगिताओं को संकलित करने के लिए उपयोग करते थे। नोटपैड का विंडोज 8 संस्करण निस्संदेह एसडीके उपकरणों के एक नए संस्करण के साथ संकलित किया जाएगा। - Cody Gray
यह सिर्फ टेक्स्ट बॉक्स नहीं है; WM_SETTEXTसामान्य रूप से स्ट्रिंग लंबाई निर्दिष्ट करने के लिए कोई पैरामीटर प्रदान नहीं करता है, और तारों को हमेशा शून्य पर समाप्त करने के लिए माना जाता है। आप एक कस्टम संदेश के साथ एक कस्टम टेक्स्ट बॉक्स बना सकते हैं जो स्ट्रिंग लम्बाई निर्दिष्ट करता है, लेकिन नोटपैड और अधिकांश अन्य प्रोग्राम उचित रूप से नहीं करते हैं। - Jason C
@ भाथीयारेरा क्योंकि मैं एक टिप्पणी में जानकारी जोड़कर काम के स्तर से संतुष्ट हूं। यदि आप चाहें तो उस जानकारी के साथ अपना उत्तर सुधारने के लिए आपका स्वागत है। - Jason C


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

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

कुछ संपादकों ने कुछ मिनट के प्रयासों के बाद काम नहीं किया था नोटपैड ++, नोटपैड 2 और अल्ट्राएडिट (v17.3, पुराना संस्करण)। इनमें से कुछ को पहले कुछ बाइट्स, जेपीईजी की कॉपी / पेस्ट के साथ समस्याएं थीं फ़ाइल हस्ताक्षर जादू संख्या एफएफ डी 8 एफएफ। हो सकता है कि वे वर्तमान में समय के मुकाबले थोड़ी अधिक झुकाव के साथ काम करेंगे।


28
2017-07-13 21:49



सब्लिमे टेक्स्ट (2/3) स्वचालित रूप से हेक्स प्रारूप में दिखाकर एक बाइनरी फ़ाइल खोलता है। उदाहरण के तौर पर, "ओपन" पर क्लिक करके जेपीईजी फ़ाइल की शुरुआत: puu.sh/aaAVx/bd08dab46e.png - tomsmeding
असल में, नोटपैड से अधिक बार एलएफ को सीआरएलएफ में परिवर्तित कर देगा, यह एलएफ को जिस तरह से छोड़ देगा और पाठ को प्रदर्शित करेगा जैसे कि कोई लाइन ब्रेक नहीं था! - Moshe Katz


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

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


6
2017-07-14 06:54





मुझे लगता है कि यह एन्कोडिंग की एक समस्या नहीं है बल्कि चरित्र सेट भी है। जेपीजी प्रारूप मूल रूप से एक बाइट स्ट्रीम है। इस प्रकार गैर-प्रिंट करने योग्य पात्रों जैसे एनयूएल, ईटीएक्स, एसटीएक्स, एसओएच, डीएलई इत्यादि।

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

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

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


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


5
2017-07-14 09:00



प्रत्येक फाइल "मूल रूप से एक बाइट स्ट्रीम" है। - Jason C
@ जेसनसी मैं असहमत हूं। जबकि प्रत्येक फ़ाइल को बाइट स्ट्रीम के रूप में पढ़ा जा सकता है। एक्सएमएल फाइलों जैसी संरचित फाइलें डेटा की धारा के रूप में पठनीय नहीं हैं। सामग्री तब तक वैध नहीं होगी जब तक फ़ाइल के अंत को पढ़ा नहीं जाता है। आधा jpg में एक कट अभी भी वैध है और प्रदर्शित किया जा सकता है। यह सिर्फ आधा तस्वीर गायब है। - sbecker
उस पर असहमति के लिए वास्तव में कोई जगह नहीं है। :) एक्सएमएल किसी और चीज की तरह बाइट्स की धारा है, और एक्सएमएल (चरित्र एन्कोडिंग के साथ) उन बाइट्स के लिए एक प्रारूप को परिभाषित करता है। यह निश्चित रूप से डेटा की धारा के रूप में पठनीय है। इसे हेक्स संपादक में खोलें, उदाहरण के लिए। डेटा की वह स्ट्रीम एक्सएमएल के रूप में बस पारदर्शी होती है। - Jason C
@ जेसनसी वास्तव में इसके साथ बहस नहीं कर सकता है। :) टच! - sbecker


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

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

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

  • विंडोज़ / डॉस सम्मेलनों में शून्य अक्षरों, रेखा के अंत और फ़ाइल अनुक्रमों के अंत को फिर से एन्कोड करें

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


2
2017-07-14 13:16



"एएनएसआई" तकनीकी रूप से सही नहीं हैहालांकि, यह आमतौर पर समझा जाता है। - Jason C