Membuka gambar JPG dengan notepad, menempelkan semua "teks" ke file notepad baru, diubah menjadi .JPG dan tidak lagi terbuka. Mengapa?

82

Fenomena ini telah membuat saya bertanya.

Ini adalah eksperimen terperinci, OS saya adalah Windows 7 x64 SP1:

  • Saya mengubah file gambar (JPG) menjadi TXT hanya dengan mengubah ekstensinya (atau orang dapat memilih untuk membuka JPG dengan notepad, hal yang sama)

Seharusnya terlihat seperti ini, urutan teks yang tampak aneh, dan beberapa di antaranya (sangat jarang) sebenarnya bermakna, seperti pada tangkapan layar di bawah "creator: dg-jpeg v1.0 ..."

Contoh teks JPG

  • Saya menonaktifkan pembungkus dan memilih semua teks menggunakan Ctrl + A (untuk memastikan tidak ada yang terlewatkan)
  • Saya menempelkan teks yang disalin ke file TXT kosong lain dan menyimpannya sebagai JPG, saya membandingkan ukuran file baru dengan JPG asli. Semuanya (JPG asli, file TXT yang dikonversi, dan file TXT yang baru dibuat) berukuran sama persis , menjadi byte.

Ketika saya mencoba untuk membuka, Windows akan mengatakan "Windows Photo Viewer tidak dapat membuka gambar ini karena file tersebut tampaknya rusak, rusak, atau terlalu besar" .

Saya bahkan mencoba mengujinya menggunakan metode lain: Membuka JPG dengan notepad, saya memotong SATU karakter yang diketahui dari lokasi yang mudah diingat (seperti karakter pertama dari baris ke-2) kemudian menyimpan file. Penampil tentu saja akan menampilkan pesan yang sama. Lalu saya membukanya lagi dan menempelkan karakter ke lokasi EXACT (Notepad mengingat status keluarnya seperti posisi windows, pembungkus, ukuran font ... jadi saya tidak punya masalah untuk memperbaikinya)

Dan masih kesalahan yang sama. Anda dapat mencoba ini untuk mendapatkan ide, ingat untuk memilih gambar kecil yang lain Notepad akan bertindak seperti orang tua yang berkarat.

Apa yang bisa menjadi penyebab fenomena ini?

Nguyễn Tuấn Danh
sumber
4
Coba perintah fc. buka cmd prompt dan lakukan- C:\blah>fc file1 file2 Dimungkinkan untuk file dengan ukuran yang sama tetapi berbeda. (meskipun biasanya beberapa perubahan acak tidak cenderung meninggalkan file dengan ukuran yang sama tetapi dengan mudah bisa). Perintah fc akan sangat berguna bagi Anda dalam menyelidiki apa yang terjadi. Anda juga dapat menggunakan perintah xxd, ini di cygwin, dan juga dilengkapi dengan vim7. xxd -p file1 Itu akan membuang hex file. Anda dapat membandingkan hex dua file dengan itu dan fc. Atau bahkan buka hex di notepad dan jentikkan di antara dua jendela notepad dengan alt-tab.
barlop
22
Anda mencoba membaca file biner dengan editor teks sederhana seperti notepad. Itu tidak akan dapat membaca pengkodean ANSI dengan benar dan karenanya akan mengubahnya. Ketika Anda menyimpannya maka file tidak akan menjadi biner lagi dan dengan demikian parser tidak dapat membaca data di dalam file. (Cari perbedaan antara penyimpanan file berbasis XML dan penyimpanan file Biner, ini adalah topik yang menarik.) Jika Anda akan mencoba eksperimen yang sama dengan Notepad ++, Anda akan berhasil dalam apa yang Anda coba.
woutervs
3
Untuk yang berminat: Anda dapat mengedit gambar di Vim: Namun, masalahnya adalah, Vim yang mengkonversi file dalam format XPM , yang merupakan ASCII biasa.
Boldewyn
4
Singkatnya, Notepad memodifikasi file Anda sebelum menampilkannya kepada Anda.
Derek 朕 會 功夫

Jawaban:

81

Bergantung pada penyandian yang digunakan untuk membuka file Anda mungkin melihat perilaku yang berbeda. Notepad Windows 7 saya memungkinkan untuk membuka file dalam ANSI, UTF-8, Unicode atau Unicode big endian.

Saya telah menguji masalah ini dengan gambar jpeg 2x2 piksel kecil yang dibuat dengan gimp dan membuka dan menyimpan file gambar dengan pengkodean ANSI. Membuka gambar asli dan gambar yang disimpan dengan hex editor Saya melihat bahwa semua 00 urutan (dua digit hex, karakter kontrol NUL ) telah dikonversi menjadi 20 (karakter spasi).

Mengganti kembali dalam hex editor semua 20 oleh 00 mengembalikan format gambar.

Saya sudah googled sedikit dan saya tidak menemukan referensi yang menjelaskan mengapa ia melakukannya. Hanya referensi ke pos yang memperingatkan tentang hal itu (tautan cache Google, halaman tidak tersedia).

Jika Anda menyimpan / membuka file sebagai UTF-8 tampaknya masih mengkonversi karakter NUL ke spasi tetapi juga meningkatkan ukuran file yang dihasilkan karena konversi dari karakter single-byte ke UTF-8 urutan multi-byte.

Jika Anda menyimpan / membuka file sebagai Unicode tampaknya masih mengkonversi karakter NUL ke spasi tetapi juga menambahkan byte ke awal file, BOM .

mangper
sumber
22
0x00 adalah terminator string dalam string C. Mereka mungkin telah menggantinya karena file teks tidak boleh memuatnya. Notepad adalah program yang sangat lama.
Zonder
25
Saya ragu bahwa notepad.exe adalah .NET executable.
Knittl
10
@Bakuriu AC string pasti bisa ada dalam file; Saya bisa memikirkan banyak format file yang mengandungnya. Dan sebagian besar aplikasi yang dikirimkan dengan aplikasi Windows adalah asli, bukan .NET. Yang mengatakan, notepad tidak menulis string yang diakhiri null ke file.
Carey Gregory
4
@ Bakuriu: Program Windows biasanya tidak ditulis dalam .Net. Ini C / C ++ dan asli pada intinya. Salah satu aplikasi .Net yang dikembangkan oleh microsoft adalah live writer yang sekarang dihentikan.
bhathiya-perera
5
@ SJuan76 Hah? C ++ tidak mendefinisikan tipe data yang bernama byte. Mungkin Anda sedang memikirkan bahasa lain. Dan pengembang aplikasi dapat menangani data biner namun mereka anggap cocok, termasuk penggunaan string C jika mereka mau. Seperti yang saya katakan sebelumnya, saya bisa memikirkan banyak format file biner yang berisi string C.
Carey Gregory
37

Mengapa gagal:

Notepad membuat spasi (ASCII code 32)karakter untuk karakter seperti NUL (ASCII code 0) karena kotak teks Windows API hanya memungkinkan char * ASCIIZ yang diakhiri nol (array karakter, pointer). Itu akan terputus pada NUL pertama.

Itu terjadi karena Windows API sebagian besar ditulis dalam bahasa C dan string diakhiri null adalah salah satu fitur umum. Bahkan ketika Windows modern dan Unicode dianggap sebagai string yang diakhiri dengan null. Jadi notepad cukup menggantinya dengan ruang sehingga Anda dapat melihat file lengkap.

Jadi, ketika Anda menyimpan file itu rusak.

wikipedia-null string yang diakhiri


Bagaimana melakukan penelitian lebih lanjut:

Anda dapat menggunakan komparator seperti di luar banding (komersial, percobaan) untuk melihat efek penggantian karakter. juga melihat alat membandingkan biner lainnya .

perbandingan hex

Catatan : (20) 16 = (32) 10


Alasan notepad bertindak lambat pada file besar

Ini memeriksa setiap karakter dan mengganti karakter khusus dengan spasi. Perangkat lunak lain tidak melakukan konversi dalam memori (setidaknya tidak primitif sebagai notepad). Mereka hanya memberikan karakter khusus secara berbeda. Dan mereka menggunakan teknik buffering canggih.


Melihat ke Notepad.exe (XP 32 bit)

(Saya berasumsi ini masih ditulis dalam C ++ atau setidaknya menggunakan linker yang serupa )

notes

Saya menggunakan alat PEiD (yang menghentikan pengembangan dengan memperkenalkan PE + / 64 exes)

PEiD dapat ditemukan dibundel dalam folder bin Universal Extractor

Saya mengekstrak notepad. File ex_ dari iso Windows xp jelas. Cobalah. Ini adalah ekstrak file cab menggunakan 7z.

Peringatan ! Pemindai virus Anda mungkin mendeteksi Universal Extractor / PEiD sebagai alat peretas atau virus. Jangan Percaya itu, jangan mengunduhnya !!


Info lebih lanjut tentang windows API

kredit: Jason C

Bukan hanya kotak teks; WM_SETTEXT secara umum tidak memberikan parameter untuk menentukan panjang string, dan string selalu dianggap berakhir pada nol. Anda selalu dapat membuat kotak teks khusus dengan pesan khusus yang menentukan panjang string, tetapi Notepad dan sebagian besar program lainnya tidak. Juga fungsi SetWindowText tidak menyediakan parameter panjang juga.

bhathiya-perera
sumber
1
Agak aneh bahwa Anda menunjukkan lembar properti untuk executable Notepad yang dibundel dengan versi Windows XP, namun jika dilihat dari tema window, Anda jelas menjalankan beberapa versi Windows 8. Itu akan menjelaskan mengapa executable itu dikaitkan dengan versi 7.1 dari toolset — itulah yang mereka gunakan untuk mengkompilasi Windows XP dan utilitas terkait. Notepad versi Windows 8 tidak diragukan lagi akan dikompilasi dengan versi yang lebih baru dari alat SDK.
Cody Grey
2
Bukan hanya kotak teks; WM_SETTEXTsecara umum tidak memberikan parameter untuk menentukan panjang string, dan string selalu dianggap berakhir pada nol. Anda selalu dapat membuat kotak teks khusus dengan pesan khusus yang menentukan panjang string, tetapi Notepad dan sebagian besar program lainnya tidak.
Jason C
@ BhathiyaPerera Karena saya puas dengan tingkat pekerjaan yang telah saya lakukan dengan menambahkan info dalam komentar. Anda dipersilakan untuk meningkatkan jawaban Anda dengan informasi itu jika Anda mau.
Jason C
28

Notepad tidak mempertahankan semua karakter khusus / diperluas persis seperti apa adanya. Saya tidak memiliki referensi untuk perilaku ini segera di tangan tetapi telah menemukan ini menjadi kasus misalnya dengan LF garis akhir gaya UNIX yang Notepad akan dikonversi menjadi CRLF dan null (0x00) yang akan diabaikan. Dalam file biner seperti JPG, ada kemungkinan terjadi karakter acak yang tidak disimpan oleh Notepad. Coba percobaan Anda dengan editor yang sadar-HEX dan itu harusnya berhasil. Saya akan memperbarui jawaban saya jika saya menemukan referensi yang bagus dan setelah saya menguji editor HEX.

Pembaruan: Saya mencoba beberapa editor programer terkenal tetapi hanya satu dari mereka yang bekerja langsung, HxD oleh Maël Hörz . Saya tidak pernah menggunakan HxD sebelumnya tetapi menemukannya berkat jawaban untuk artikel Stack ini, plugin hex viewer / editor untuk Notepad ++ .

Editor lain yang tidak berfungsi setelah beberapa menit upaya adalah Notepad ++, Notepad2 dan UltraEdit (v17.3, versi yang lebih lama). Beberapa di antaranya memiliki masalah dengan copy / paste dari beberapa byte pertama, file ajaib tanda tangan file JPEG FF D8 FF. Mungkin mereka akan bekerja dengan sedikit lebih mengutak-atik daripada yang saya miliki saat ini.

JohnC
sumber
Teks Sublim (2/3) secara otomatis membuka file biner dengan menunjukkannya dalam format hex. Sebagai contoh, awal file JPEG dengan hanya mengklik "buka": puu.sh/aaAVx/bd08dab46e.png
tomsmeding
3
Sebenarnya, lebih sering daripada notepad akan mengkonversi LF ke CRLF, itu akan meninggalkan LF seperti itu dan menampilkan teks seolah-olah tidak ada jeda baris sama sekali!
Moshe Katz
6

Anda dulu dapat melakukan ini dengan Menulis kembali pada hari itu. Itu adalah program standar di Windows 3.1 tetapi saya tidak ingat apakah Windows 95 memasukkannya. Menulis akan memungkinkan pengeditan aman biner dari file apa pun yang dapat dibuka (ukuran file mungkin sangat terbatas). Notepad jelas bukan biner aman (teks tetap sama tetapi byte sebenarnya dari karakter non-teks [misalnya kode kontrol] dapat berubah) itulah sebabnya contoh JPG Anda tidak berfungsi. Coba dapatkan salinan Tulis (dan Windows yang sangat lama) dan coba eksperimen Anda lagi!

Menurut artikel Wikipedia "Windows Write", Write dimasukkan hingga Windows NT 3.5. Itu digantikan oleh Wordpad di Windows 95 dan seterusnya. write.exemasih ada di direktori Windows tetapi hanyalah pembungkus untuk membuka Wordpad.

CJ Dennis
sumber
5

Saya pikir itu bukan masalah encoding tetapi juga set karakter. Format JPG pada dasarnya adalah aliran byte. Sehingga memungkinkan karakter yang tidak dapat dicetak seperti NUL, ETX, STX, SOH, DLE, dll.

Microsoft Notepad tidak dapat menampilkan karakter yang tidak dapat dicetak itu. Mungkin menampilkan placeholder semacam ruang untuk karakter nol. Jadi membuka file dengan Notepad tidak menunjukkan konten yang sebenarnya tetapi konten diterjemahkan oleh pengkodean yang dipilih (utf-8, utf-16, dll) dan ditampilkan oleh set karakter tertentu (unicode, ascii, dll) tidak termasuk karakter yang dapat dicetak.

Saat memilih semua teks yang ditampilkan dan menyalin teks ke clipboard, Anda hanya menyalin karakter yang dapat dicetak termasuk placeholder. Dengan demikian secara otomatis mengkonversi karakter-nol ke spasi dan mengabaikan karakter yang tidak dapat dicetak lainnya sepenuhnya.

Jadi pada dasarnya Anda hanya kehilangan konten karena melakukannya dengan cara ini. Jika Anda menggunakan hex-editor sebagai gantinya, itu akan menyalin semua konten sepenuhnya.


Pembaruan: Jawaban Bhathiya Pereras benar: https://superuser.com/a/782885/322784 Karakter yang tidak dapat dicetak tidak diabaikan ketika menyalin teks ke clipboard.

sbecker
sumber
Setiap file "pada dasarnya aliran byte".
Jason C
1
@ JasonC, saya tidak akan setuju. Sementara setiap file dapat dibaca sebagai aliran byte. File terstruktur seperti file XML tidak dapat dibaca sebagai aliran data. Konten tidak akan valid hingga akhir file telah dibaca. Potongan setengah jpg masih valid dan dapat ditampilkan. Hanya setengah gambar yang hilang.
sbecker
Sebenarnya tidak ada ruang untuk ketidaksepakatan tentang itu. :) XML adalah aliran byte seperti yang lainnya, dan XML (bersama dengan pengkodean karakter) mendefinisikan format untuk byte tersebut. Ini tentu bisa dibaca sebagai aliran data. Buka di hex editor, misalnya. Aliran data itu kebetulan dapat diuraikan sebagai XML.
Jason C
@JasonC Tidak bisa berdebat dengan itu sebenarnya. :) Sentuh!
sbecker
2

File JPEG berisi data non-teks kecuali untuk beberapa bidang, pada dasarnya setiap nilai byte antara 0 dan 255 akan ditemukan, terutama di area yang mewakili gambar terkompresi yang dikodekan yang berisi data yang hampir pseudorandom.

Tetapi Notepad akan memperlakukan data sebagai teks ANSI secara default, sehingga akan melakukan berbagai hal yang akan mengubah data asli, seperti:

  • ganti bytes yang memetakan karakter khusus / tidak terdefinisi / terlarang karena tidak masuk akal untuk teks ANSI yang valid

  • mengkode ulang karakter nol, akhir baris dan akhir urutan file ke konvensi Windows / DOS

Yang berarti jika Anda mengedit dan menyimpan data sebagai teks, itu akan mengubah jpeg dalam kasus terbaik, dan membuatnya tidak dapat digunakan dalam kondisi terburuk.

Dadu9
sumber
"ANSI" secara teknis tidak benar , meskipun umumnya dipahami.
Jason C