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 ..."
- 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?
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.Jawaban:
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 .
sumber
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.Mengapa gagal:
Notepad membuat spasi
(ASCII code 32)
karakter untuk karakter seperti NUL(ASCII code 0)
karena kotak teks Windows API hanya memungkinkanchar *
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 .
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 )
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.
sumber
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.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.
sumber
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.exe
masih ada di direktori Windows tetapi hanyalah pembungkus untuk membuka Wordpad.sumber
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.
sumber
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.
sumber