Question Ouvert une image JPG avec le bloc-notes, collé tout le "texte" dans un nouveau fichier de bloc-notes, modifié en .JPG et il ne s'ouvre plus. Pourquoi?


Ce phénomène m'a laissé des questions à poser.

Voici l'expérience détaillée, mon système d'exploitation est Windows 7 x64 SP1:

  • J'ai changé un fichier image (JPG) en TXT simplement en changeant son extension (ou on pouvait simplement choisir d'ouvrir le JPG avec le bloc-notes, même chose)

Cela devrait ressembler à ceci, des séquences de textes à l'apparence étrange, et certaines (très rares) sont réellement significatives, comme dans la capture d'écran ci-dessous "créateur: dg-jpeg v1.0 ..."

Sample JPG text

  • J'ai désactivé l'emballage et sélectionné tout le texte en utilisant Ctrl + A (pour s'assurer que rien n'est manqué)
  • J'ai collé le texte copié dans un autre fichier TXT vierge et l'ai enregistré en tant que fichier JPG, j'ai comparé la nouvelle taille du fichier avec le fichier JPG d'origine. Tous (le JPG original, le fichier TXT converti et le fichier TXT nouvellement créé) sont du exact même taille, en octets.

Lorsque j'ai essayé d'ouvrir, Windows disait "Windows Photo Viewer ne peut pas ouvrir cette image car le fichier semble être endommagé, endommagé ou trop volumineux".

J'ai même essayé de le tester en utilisant une autre méthode: j'ai ouvert le JPG avec le bloc-notes, j'ai coupé UN caractère connu d'un endroit facile à retenir (comme le premier caractère de la 2ème ligne) puis enregistrez le fichier. Le spectateur afficherait bien sûr le même message. Puis je l'ai ouvert à nouveau et ai collé le personnage à la EXACT location (le bloc-notes se souvient de son état de sortie, comme la position des fenêtres, l’enveloppement, la taille des polices, etc.

Et toujours la même erreur. Vous pouvez essayer cela pour avoir l’idée, n'oubliez pas de choisir une petite image. Le Bloc-notes agira comme un vieil homme rouillé.

Quelle aurait pu être la cause de ce phénomène?


80
2017-07-13 20:50


origine


Essayez la commande fc. ouvrez une invite cmd et faites C:\blah>fc file1 file2   Il est possible que les fichiers soient de la même taille mais différents. (bien qu’en général, certains changements aléatoires ne tendent pas à laisser un fichier de la même taille, mais il le pourrait facilement). La commande fc vous sera très utile pour enquêter sur ce qui se passe. Vous pouvez également utiliser la commande xxd, ceci est dans cygwin, et est également livré avec vim7. xxd -p fichier1 Cela va vider l'hex d'un fichier. Vous pouvez comparer l'hex des deux fichiers avec cela et fc. Ou même ouvrir l'hex dans le bloc-notes et passer entre les deux fenêtres du bloc-notes avec l'onglet Alt. - barlop
Vous essayez de lire un fichier binaire avec un éditeur de texte simple comme le bloc-notes. Il ne pourra pas lire correctement le codage ANSI et le convertira donc. Lorsque vous l'enregistrez, le fichier ne sera plus binaire et l'analyseur ne pourra plus lire les données contenues dans le fichier. (Recherchez la différence entre une sauvegarde de fichier basée sur XML et une sauvegarde de fichier binaire, c'est un sujet intéressant.) Si vous essayez la même expérience avec Notepad ++, vous réussirez ce que vous vouliez. - woutervs
duplicata possible de Pourquoi un fichier exe n'apparaît-il pas sous la forme de uns et de zéros dans un éditeur de texte tel que le Bloc-notes? - allquixotic
Pour les intéressés: Vous pouvez éditer des images dans Vim: Cependant, le truc est que Vim convertit le fichier dans le XPM format, qui est en clair ASCII. - Boldewyn
En bref, Notepad modifie votre fichier avant de l’afficher. - Derek 朕會功夫


Réponses:


Selon l’encodage utilisé pour ouvrir le fichier, vous risquez de voir un comportement différent. Mon bloc-notes Windows 7 permet d’ouvrir un fichier en ANSI, UTF-8, Unicode ou Unicode big endian.

J'ai testé ce problème avec une petite image jpeg de 2x2 pixels créée avec gimp et en ouvrant et en enregistrant le fichier image avec un encodage ANSI. En ouvrant l’image originale et l’image enregistrée avec un éditeur hexadécimal, je vois que toutes les séquences 00 (deux chiffres hexadécimaux, Caractère de contrôle NUL) ont été convertis en 20 (espace).

Remplacement dans l'éditeur hexadécimal tous les 20 par 00 restaure le format d'image.

Je l'ai un peu googlé et je n'ai trouvé aucune référence expliquant pourquoi. Seulement une référence à un message qui en avertit (lien de cache Google, la page n'est pas disponible).

Si vous enregistrez / ouvrez le fichier en UTF-8, il semble qu'il convertisse toujours les caractères NUL en espaces, mais augmente également la taille du fichier résultant des conversions de caractères à un octet en séquences multi-octets UTF-8.

Si vous enregistrez / ouvrez le fichier en Unicode, il semble qu'il convertit toujours les caractères NUL en espaces mais ajoute également un octet au début du fichier, le BOM.


79
2017-07-13 23:06



0x00 est un terminateur de chaîne dans les chaînes C. Ils peuvent les avoir remplacés car un fichier texte ne doit pas les contenir. Le Bloc-notes est un programme très ancien. - Zonder
Je doute que notepad.exe soit un exécutable .NET. - knittl
@Bakuriu Une chaîne C peut certainement exister dans un fichier; Je peux penser à de nombreux formats de fichiers qui les contiennent. Et la grande majorité des applications fournies avec les applications Windows sont natives et non .NET. Cela dit, notepad n'écrit pas de chaînes terminées par un caractère nul dans les fichiers. - Carey Gregory
@ Bakuriu: les programmes Windows ne sont généralement pas écrits dans .Net. C'est C / C ++ et natif à la base. L'une des applications .Net développées par Microsoft était live writer, qui n'est plus disponible. - Bhathiya Perera
@ SJuan76 Hein? C ++ ne définit pas un type de données nommé byte. Vous pensez peut-être à une autre langue. Et les développeurs d’applications peuvent traiter les données binaires comme bon leur semble, y compris l’utilisation de chaînes C si elles le souhaitent. Comme je l'ai déjà dit, je peux penser à de nombreux formats de fichiers binaires contenant des chaînes C. - Carey Gregory


Pourquoi cela échoue:

Bloc-notes créer des espaces (ASCII code 32) personnage pour personnages comme NUL  (ASCII code 0) parce que la zone de texte de l'API Windows n'autorise que les caractères nuls char *  ASCIIZ (tableau de caractères, pointeur). Il est coupé au premier NUL. 

Cela arrive parce que API Windows est principalement écrit en C langue et chaînes terminées à zéro sont l'une des caractéristiques communes. Même si Windows et Unicode modernes sont considérés comme identiques, les chaînes terminées par un code NULL se produisent. Alors notepad simplement les remplacer par de l'espace afin que vous puissiez voir le fichier complet.

Donc, lorsque vous enregistrez le fichier, il est corrompu.

wikipedia-null terminées chaînes


Comment faire d'autres recherches:

Vous pouvez utiliser un comparateur comme sans comparaison (commercial, essai) pour voir l'effet de remplacement de personnage. regarde aussi autres outils de comparaison binaires.

hex comparison

Remarque : (20)16 = (32)dix


La raison du bloc-notes agit lentement sur les gros fichiers

 Il vérifie chaque caractère et remplace les caractères spéciaux par des espaces. Les autres logiciels ne font pas de conversions en mémoire (du moins pas de primitif en tant que bloc-notes). Ils ne font que rendre les caractères spéciaux différemment. Et ils utilisent des techniques de mise en mémoire tampon avancées.


En regardant dans Notepad.exe (XP 32 bits)

(Je suppose qu'il est toujours écrit en C ++ ou au moins utiliser un linker )

notepad

J'utilise le PEiD outil (qui a arrêté le développement avec l'introduction de PE + / 64 exes)

PEiD peut être trouvé dans le dossier bin de Extracteur universel

J'ai extrait le bloc-notes. ex_ fichier de Windows XP iso évidemment. Essaye le. C'est un extrait de fichier cab utilisant 7z.

Attention ! Votre antivirus peut détecter Universal Extractor / PEiD en tant qu'outil de piratage ou virus. Ne vous fiez pas, ne le téléchargez pas !!


Plus d'infos sur Windows API

crédits:Jason C

Ce n'est pas juste la zone de texte; WM_SETTEXT en général, ne fournit aucun paramètre pour spécifier la longueur de la chaîne, et les chaînes sont toujours supposées se terminer à null. Vous pouvez toujours créer une zone de texte personnalisée avec un message personnalisé qui spécifie la longueur de la chaîne, mais ce n'est pas le cas du Bloc-notes et de la plupart des autres programmes. Aussi la fonction SetWindowText ne fournit pas non plus de paramètre de longueur.


35
2017-07-14 09:59



Il est un peu étrange que vous affichez la feuille de propriétés d'un exécutable Notepad fourni avec une version de Windows XP, mais à en juger par le thème de la fenêtre, vous exécutez clairement une version de Windows 8. Cela expliquerait pourquoi le fichier exécutable était lié à la version 7.1 du jeu d'outils - c'est ce qu'ils ont utilisé pour compiler Windows XP et les utilitaires associés. La version Windows 8 de Notepad sera sans aucun doute compilée avec une version plus récente des outils du SDK. - Cody Gray
Ce n'est pas juste la zone de texte; WM_SETTEXTen général, ne fournit aucun paramètre pour spécifier la longueur de la chaîne, et les chaînes sont toujours supposées se terminer à null. Vous pouvez toujours créer une zone de texte personnalisée avec un message personnalisé qui spécifie la longueur de la chaîne, mais ce n'est pas le cas du Bloc-notes et de la plupart des autres programmes. - Jason C
@BhathiyaPerera Parce que je suis satisfait du niveau de travail que j'ai accompli en ajoutant des informations dans un commentaire. Si vous le souhaitez, vous pouvez améliorer votre réponse avec cette information. - Jason C


Le Bloc-notes ne conserve pas tous les caractères spéciaux / étendus tels quels. Je n'ai pas de référence pour ce comportement immédiatement disponible, mais j'ai trouvé que cela était le cas, par exemple, avec la fin de ligne LF de style UNIX que Notepad convertira en CRLF et null (0x00) qu'il ignorera. Dans un fichier binaire tel qu'un fichier JPG, il peut y avoir des occurrences aléatoires du ou des caractères que le Bloc-notes ne conserve pas. Essayez votre expérience avec un éditeur compatible HEX et cela devrait fonctionner. Je mettrai à jour ma réponse si je trouve une bonne référence et une fois que j'ai testé un éditeur HEX.

Mise à jour: j'ai essayé quelques éditeurs de programmeurs bien connus, mais un seul d'entre eux a tout de suite travaillé, HxD de Maël Hörz. Je n'ai jamais utilisé HxD auparavant mais je l'ai trouvé grâce à une réponse à cet article de Stack, Un plugin / éditeur hexadécimal pour Notepad ++.

Notepad ++, Notepad2 et UltraEdit (version plus ancienne) étaient les autres éditeurs qui ne fonctionnaient pas après quelques minutes d'effort. Un couple d'entre eux avait des problèmes avec le copier / coller des premiers octets, le JPEG nombre magique de signature de fichier FF D8 FF. Peut-être qu'ils travailleraient avec un peu plus de violon que je n'ai le temps pour le moment.


28
2017-07-13 21:49



Sublime Text (2/3) ouvre automatiquement un fichier binaire en le affichant au format hexadécimal. Par exemple, le début du fichier JPEG en cliquant simplement sur "ouvrir": puu.sh/aaAVx/bd08dab46e.png - tomsmeding
En fait, plus souvent que le bloc-notes convertira LF à CRLF, il quittera la LF la façon dont il est et afficher le texte comme s'il n'y avait pas saut de ligne du tout! - Moshe Katz


Vous pouviez faire cela avec Write back the day. C'était un programme standard sous Windows 3.1 mais je ne me souviens plus si Windows 95 l’avait inclus. Write permettrait une édition sécurisée binaire de tout fichier qu'il pourrait ouvrir (probablement une taille de fichier très limitée). Notepad n'est certainement pas binaire (le texte reste le même mais les octets réels des caractères non textuels [par exemple, les codes de contrôle] peuvent changer), ce qui explique pourquoi votre exemple JPG ne fonctionne pas. Essayez d'obtenir une copie de Write (et des très anciens Windows) et essayez à nouveau votre expérience!

Selon L'article de "Windows Write" de Wikipedia Write a été inclus dans Windows NT 3.5. Il a été remplacé par Wordpad dans Windows 95 et suivants. write.exe était toujours présent dans le répertoire Windows mais était simplement un wrapper pour ouvrir Wordpad.


6
2017-07-14 06:54





Je pense que ce n'est pas tant un problème d'encodage mais aussi de jeu de caractères. Le format JPG est essentiellement un flux d'octets. Permettant ainsi des caractères non imprimables comme NUL, ETX, STX, SOH, DLE, etc.

Le Bloc-notes Microsoft ne peut pas afficher ces caractères non imprimables. Il peut afficher des caractères génériques comme un espace pour un caractère nul. Donc, ouvrir le fichier avec le Bloc-notes ne montre pas le contenu réel mais le contenu décodé par le codage sélectionné (utf-8, utf-16, etc.) et affiché par un certain jeu de caractères (unicode, ascii, etc.) caractères imprimables.

Lorsque vous sélectionnez tout le texte affiché et que vous copiez le texte dans le Presse-papiers, vous ne copiez que les caractères imprimables, y compris les espaces réservés. Convertissant ainsi automatiquement les caractères nuls en espaces et en ignorant complètement les autres caractères non imprimables.

Donc, fondamentalement, vous perdez simplement du contenu en procédant ainsi. Si vous utilisez un éditeur hexadécimal, il copiera tout le contenu entièrement.


Mettre à jour: La réponse de Bhathiya Pereras est juste: https://superuser.com/a/782885/322784 Les caractères non imprimables ne sont pas ignorés lors de la copie de texte dans le presse-papier.


5
2017-07-14 09:00



Chaque fichier est "essentiellement un flux d'octets". - Jason C
@JasonC Je ne suis pas d'accord. Alors que chaque fichier peut être lu comme un flux d'octets. Les fichiers structurés tels que les fichiers XML ne sont pas lisibles en tant que flux de données. Le contenu ne serait pas valide jusqu'à la fin de la lecture du fichier. Une coupe en deux jpg est toujours valide et peut être affichée. Il ne manque que la moitié de la photo. - sbecker
Il n'y a pas vraiment de place pour un désaccord à ce sujet. :) XML est un flux d'octets comme toute autre chose, et XML (avec le codage de caractères) définit un format pour ces octets. Il est certainement lisible comme un flux de données. Ouvrez-le dans un éditeur hexadécimal, par exemple. Ce flux de données arrive à être analysable en XML. - Jason C
@ JasonC Ne peut pas discuter avec cela en fait. :) Touché! - sbecker


Le fichier JPEG contient des données non textuelles, à l'exception de certains champs, essentiellement tout octet compris entre 0 et 255, en particulier dans la zone représentant l'image compressée codée contenant des données presque pseudo-aléatoires.

Mais Notepad traitera les données comme du texte ANSI par défaut, il fera donc diverses choses qui modifieront les données d'origine, comme:

  • remplacer les octets mappant des caractères spéciaux / indéfinis / interdits car ils ne sont pas pertinents pour un texte ANSI valide

  • re encoder les caractères null, fin de ligne et fin de séquence de fichier aux conventions Windows / DOS

Ce qui signifie que si vous éditez et enregistrez les données sous forme de texte, cela changera le format JPEG dans le meilleur des cas et le rendra inutilisable au pire.


2
2017-07-14 13:16



"ANSI" n'est pas techniquement correct, bien que ce soit généralement compris. - Jason C