Accueil > Forum > > > > Logiciels & librairies Microsoft: définitivement buggés ?
Logiciels & librairies Microsoft: définitivement buggés ?
samedi 31 mai 2003 à 16:28:18 |
Logiciels & librairies Microsoft: définitivement buggés ?

BenjZ
|
Salut à tous, Je développe depuis 2 jours un petit logiciel de stéganographie tout bête: il code un fichier dans une bitmap sur les bits de poids faible, cela permet de stocker 125Ko dans une image de 1Mo par exemple. L'avantage est de pouvoir y stocker tout type de données (texte, image, logiciel...). Depuis ces deux mêmes jours, je cherche désespérément le bug dans mon code, qui encode mal ( un fichier texte court fonctionne, mais dès qu'on passe à une jpeg un peu large, tout se met à dysfonctionner.) Voyant que les fread, fwrite ne réagissent déjà pas comme prévu, je suis obligé de mettre des fseek partout, ce qui comme déjà à me taper sur les nerfs. Je code sous visual c++, avec les librairies associées. Ne trouvant pas mon bug, il m'est venu l'idée de tester le soft sous linux red hat: ô magie, tout fonctionne. D'où la moralité de cette histoire: même la librairie probablement utilisée dans TOUS les logiciels du marché windows, j'ai nommé stdio.h, de GROS bugs subsistent lorsque l'on lit octet par octet. Est-ce qu'un jour, nous pourrons avoir un environnement de développement stable, pour pouvoir partir sur de bonnes bases et ainsi produire des logiciels stables ? Je commence sérieusement à désespérer de Micro$oft... Sans bien entendu parler des plantages de mon PC :( Je vous joins la source pour que vous puissiez vous rendre compte par vous-même (si vous compilez sous windows, virez la fonction itoa que j'ai réécrite rapidos pour être utilisée en base10, bizarrement sous nux il ne la connaissait pas, je n'ai pas voulu me prendre la tête une fois de plus) L'utilisation est simple: stegano --encode image.bmp fichier.xxx stegano --decode image.bmp fichier.xxx Faites-moi part de vos commentaires Je trouve désespérant d'être obligé d'utiliser des moyens détournés (dans la prochaine version, je lirai tout d'un bloc pour stocker ça dans un buffer temporaire) pour arriver à ses fins, surtout que stdio.h est une "vieille" librairie qui ne devrait plus avoir à faire ses preuves. A bon entendeur... Benj #include <stdlib.h> #include <stdio.h> #include <string.h>
#define ENCODE 0 #define DECODE 1
void ShowUsage (const char *) ; bool GetBit (char, unsigned short) ; char *itoa (int, char*, int); int main (int argc, char *argv[]) { FILE *pBitmap, *pFile ; bool action ; char c, cFile, info[16], temp[16] ; unsigned short p=0 ; long i, lFileSize, lBmpSize, pos, posFile ;
// Check action & open [/create] files if (argc != 4) ShowUsage (argv[0]) ;
if (strcmp (argv[1], "--encode") == 0) { action = ENCODE ; if ((pBitmap = fopen (argv[2], "rb+")) == NULL) { printf ("Error opening %s !\n", argv[2]) ; exit (1) ; } if ((pFile = fopen (argv[3], "rt")) == NULL) { printf ("Error opening %s !\n", argv[3]) ; fclose (pBitmap) ; exit (1) ; } } else if (strcmp (argv[1], "--decode") == 0) { action = DECODE ; if ((pBitmap = fopen (argv[2], "rb")) == NULL) { printf ("Error opening %s !\n", argv[2]) ; exit (1) ; } if ((pFile = fopen (argv[3], "wt")) == NULL) { printf ("Error creating %s !\n", argv[3]) ; fclose (pBitmap) ; exit (1) ; } } else ShowUsage (argv[0]) ;
// Getting Bitmap File size fseek (pBitmap, 0, SEEK_END) ; lBmpSize = ftell (pBitmap) ;
// Seeking Bitmap to Data Offset (info at Offset 0x000A) fseek (pBitmap, 0x000A, SEEK_SET) ; fread (&c, 1, 1, pBitmap) ; fseek (pBitmap, c, SEEK_SET) ; pos = c;
switch (action) { case ENCODE: // Getting File to encode's size fseek (pFile, 0, SEEK_END) ; lFileSize = ftell (pFile) ; rewind (pFile) ;
// Merging STG Header to Bitmap File: strcpy (info, "STG") ; strcat (info, itoa (lFileSize, temp, 10)) ; for (i=0; i<=(long)strlen (info); i++) { for (p=0; p<8; p++) { fseek(pBitmap, pos, SEEK_SET); fread (&c, 1, 1, pBitmap) ; if (GetBit (info[i], p) == 1) c |= 0x01 ; else c &= 0xFE ; fseek(pBitmap, pos, SEEK_SET); fwrite (&c, 1, 1, pBitmap) ; pos++; } }
// Merging File content to Bitmap for (i=0; i<lFileSize; i++) { fseek (pFile, i, SEEK_SET) ; /// fread (temp, 1, 1, pFile) ; cFile = temp[0]; ///^cFile for (p=0; p<8; p++) { fseek(pBitmap, pos, SEEK_SET); fread (&c, 1, 1, pBitmap) ; //printf ("%d\n", c); /// if (GetBit (cFile, p) == 1) c |= 0x01 ; else c &= 0xFE ; fseek(pBitmap, pos, SEEK_SET); fwrite (&c, 1, 1, pBitmap) ; pos++; } } printf("Coded file size: %d\n", lFileSize); break ;
case DECODE: posFile = 0 ; /// // Looking for STG Header for (i=0; i<3; i++) { cFile = 0x00 ; for (p=0; p<8; p++) { fseek (pBitmap, pos, SEEK_SET) ; /// fread (&c, 1, 1, pBitmap) ; pos++ ; /// if ((c & 0x01) == 0x01) cFile |= (1 << p) ; } temp[i] = cFile ; } temp[3] = 0 ; if (strcmp (temp, "STG") != 0) { printf ("Error: cannot find STG Header in Bitmap.\n") ; fclose (pBitmap) ; fclose (pFile) ; exit (1) ; } // Getting merged file size for (i=0; cFile!=0x00; i++) { cFile = 0x00 ; for (p=0; p<8; p++) { fseek (pBitmap, pos, SEEK_SET) ; /// fread (&c, 1, 1, pBitmap) ; pos++ ; /// if ((c & 0x01) == 0x01) cFile |= (1 << p) ; } temp[i] = cFile ; } temp[i] = 0 ; lFileSize = atoi (temp) ;
printf("FZ: %d\n", lFileSize) ;
// Extracting file for (i=0; i<lFileSize; i++) { cFile = 0x00 ; for (p=0; p<8; p++) { fseek (pBitmap, pos, SEEK_SET) ; /// fread (&c, 1, 1, pBitmap) ; pos++ ; /// if ((c & 0x01) == 0x01) cFile |= (1 << p) ; } fseek (pFile, posFile, SEEK_SET) ; /// fwrite (&cFile, 1, 1, pFile) ; posFile++ ; /// } }
fclose (pBitmap) ; fclose (pFile) ;
printf ("Done.\n") ;
return 0 ; }
void ShowUsage (const char *szFilename) { printf ("Usage: %s <option> <bitmap file> <non-coded file>\n", szFilename) ; printf ("\t--encode\tEncode <non-coded file> into <bitmap file>\n") ; printf ("\t--decode\tDecode <bitmap file> into <non-coded file>\n") ; printf ("\tText file lTextSize must be at max 1/8 bitmap file size\n") ; exit (1) ; }
bool GetBit (char c, unsigned short b) { return (((c & (0x01 << b)) == (0x01 << b)) ? 1 : 0) ; }
char* itoa (int i, char* buffer, int x) { int j=0; while (i!=0) { buffer[j] = 48 + i%10 ; i/=10; j++; } buffer[j] = 0 ; return buffer; }
|
|
samedi 31 mai 2003 à 17:04:51 |
Re : Logiciels & librairies Microsoft: définitivement buggés ?

BruNews
|
Elle n'a surtout rien a faire dans un prog win32, le kernel fournissant des fonctions de fichiers autrement + puissantes. BruNews, ciao...
------------------------------- Réponse au message : -------------------------------
> Salut à tous, > > Je développe depuis 2 jours un petit logiciel de stéganographie tout bête: il code un fichier dans une bitmap sur les bits de poids faible, cela permet de stocker 125Ko dans une image de 1Mo par exemple. L'avantage est de pouvoir y stocker tout type de données (texte, image, logiciel...). > > Depuis ces deux mêmes jours, je cherche désespérément le bug dans mon code, qui encode mal ( un fichier texte court fonctionne, mais dès qu'on passe à une jpeg un peu large, tout se met à dysfonctionner.) > Voyant que les fread, fwrite ne réagissent déjà pas comme prévu, je suis obligé de mettre des fseek partout, ce qui comme déjà à me taper sur les nerfs. > > Je code sous visual c++, avec les librairies associées. > > Ne trouvant pas mon bug, il m'est venu l'idée de tester le soft sous linux red hat: ô magie, tout fonctionne. > > D'où la moralité de cette histoire: même la librairie probablement utilisée dans TOUS les logiciels du marché windows, j'ai nommé stdio.h, de GROS bugs subsistent lorsque l'on lit octet par octet. > > Est-ce qu'un jour, nous pourrons avoir un environnement de développement stable, pour pouvoir partir sur de bonnes bases et ainsi produire des logiciels stables ? > > Je commence sérieusement à désespérer de Micro$oft... Sans bien entendu parler des plantages de mon PC :( > > Je vous joins la source pour que vous puissiez vous rendre compte par vous-même > (si vous compilez sous windows, virez la fonction itoa que j'ai réécrite rapidos pour être utilisée en base10, bizarrement sous nux il ne la connaissait pas, je n'ai pas voulu me prendre la tête une fois de plus) > > L'utilisation est simple: > stegano --encode image.bmp fichier.xxx > stegano --decode image.bmp fichier.xxx > > > Faites-moi part de vos commentaires > Je trouve désespérant d'être obligé d'utiliser des moyens détournés (dans la prochaine version, je lirai tout d'un bloc pour stocker ça dans un buffer temporaire) pour arriver à ses fins, surtout que stdio.h est une "vieille" librairie qui ne devrait plus avoir à faire ses preuves. > > A bon entendeur... > > > > Benj > > > > > #include <stdlib.h> > #include <stdio.h> > #include <string.h> > > #define ENCODE 0 > #define DECODE 1 > > void ShowUsage (const char *) ; > bool GetBit (char, unsigned short) ; > char *itoa (int, char*, int); > int main (int argc, char *argv[]) > { > FILE *pBitmap, *pFile ; > bool action ; > char c, cFile, info[16], temp[16] ; > unsigned short p=0 ; > long i, lFileSize, lBmpSize, pos, posFile ; > > // Check action & open [/create] files > if (argc != 4) ShowUsage (argv[0]) ; > > if (strcmp (argv[1], "--encode") == 0) > { > action = ENCODE ; > if ((pBitmap = fopen (argv[2], "rb+")) == NULL) > { > printf ("Error opening %s !\n", argv[2]) ; > exit (1) ; > } > if ((pFile = fopen (argv[3], "rt")) == NULL) > { > printf ("Error opening %s !\n", argv[3]) ; > fclose (pBitmap) ; > exit (1) ; > } > } > else > if (strcmp (argv[1], "--decode") == 0) > { > action = DECODE ; > if ((pBitmap = fopen (argv[2], "rb")) == NULL) > { > printf ("Error opening %s !\n", argv[2]) ; > exit (1) ; > } > if ((pFile = fopen (argv[3], "wt")) == NULL) > { > printf ("Error creating %s !\n", argv[3]) ; > fclose (pBitmap) ; > exit (1) ; > } > } > else > ShowUsage (argv[0]) ; > > // Getting Bitmap File size > fseek (pBitmap, 0, SEEK_END) ; > lBmpSize = ftell (pBitmap) ; > > // Seeking Bitmap to Data Offset (info at Offset 0x000A) > fseek (pBitmap, 0x000A, SEEK_SET) ; > fread (&c, 1, 1, pBitmap) ; > fseek (pBitmap, c, SEEK_SET) ; > pos = c; > > switch (action) > { > case ENCODE: > // Getting File to encode's size > fseek (pFile, 0, SEEK_END) ; > lFileSize = ftell (pFile) ; > rewind (pFile) ; > > // Merging STG Header to Bitmap File: > strcpy (info, "STG") ; > strcat (info, itoa (lFileSize, temp, 10)) ; > for (i=0; i<=(long)strlen (info); i++) > { > for (p=0; p<8; p++) > { > fseek(pBitmap, pos, SEEK_SET); > fread (&c, 1, 1, pBitmap) ; > if (GetBit (info[i], p) == 1) > c |= 0x01 ; > else > c &= 0xFE ; > fseek(pBitmap, pos, SEEK_SET); > fwrite (&c, 1, 1, pBitmap) ; > pos++; > } > } > > // Merging File content to Bitmap > for (i=0; i<lFileSize; i++) > { > fseek (pFile, i, SEEK_SET) ; /// > fread (temp, 1, 1, pFile) ; > cFile = temp[0]; ///^cFile > for (p=0; p<8; p++) > { > fseek(pBitmap, pos, SEEK_SET); > fread (&c, 1, 1, pBitmap) ; > //printf ("%d\n", c); /// > if (GetBit (cFile, p) == 1) > c |= 0x01 ; > else > c &= 0xFE ; > fseek(pBitmap, pos, SEEK_SET); > fwrite (&c, 1, 1, pBitmap) ; > pos++; > } > } > printf("Coded file size: %d\n", lFileSize); > break ; > > case DECODE: > posFile = 0 ; /// > // Looking for STG Header > for (i=0; i<3; i++) > { > cFile = 0x00 ; > for (p=0; p<8; p++) > { > fseek (pBitmap, pos, SEEK_SET) ; /// > fread (&c, 1, 1, pBitmap) ; > pos++ ; /// > if ((c & 0x01) == 0x01) > cFile |= (1 << p) ; > } > temp[i] = cFile ; > } > temp[3] = 0 ; > if (strcmp (temp, "STG") != 0) > { > printf ("Error: cannot find STG Header in Bitmap.\n") ; > fclose (pBitmap) ; > fclose (pFile) ; > exit (1) ; > } > // Getting merged file size > for (i=0; cFile!=0x00; i++) > { > cFile = 0x00 ; > for (p=0; p<8; p++) > { > fseek (pBitmap, pos, SEEK_SET) ; /// > fread (&c, 1, 1, pBitmap) ; > pos++ ; /// > if ((c & 0x01) == 0x01) > cFile |= (1 << p) ; > } > temp[i] = cFile ; > } > temp[i] = 0 ; > lFileSize = atoi (temp) ; > > printf("FZ: %d\n", lFileSize) ; > > // Extracting file > for (i=0; i<lFileSize; i++) > { > cFile = 0x00 ; > for (p=0; p<8; p++) > { > fseek (pBitmap, pos, SEEK_SET) ; /// > fread (&c, 1, 1, pBitmap) ; > pos++ ; /// > if ((c & 0x01) == 0x01) > cFile |= (1 << p) ; > } > fseek (pFile, posFile, SEEK_SET) ; /// > fwrite (&cFile, 1, 1, pFile) ; > posFile++ ; /// > } > } > > fclose (pBitmap) ; > fclose (pFile) ; > > printf ("Done.\n") ; > > return 0 ; > } > > > void ShowUsage (const char *szFilename) > { > printf ("Usage: %s <option> <bitmap file> <non-coded file>\n", szFilename) ; > printf ("\t--encode\tEncode <non-coded file> into <bitmap file>\n") ; > printf ("\t--decode\tDecode <bitmap file> into <non-coded file>\n") ; > printf ("\tText file lTextSize must be at max 1/8 bitmap file size\n") ; > exit (1) ; > } > > bool GetBit (char c, unsigned short b) > { > return (((c & (0x01 << b)) == (0x01 << b)) ? 1 : 0) ; > } > > char* itoa (int i, char* buffer, int x) > { > int j=0; > while (i!=0) > { > buffer[j] = 48 + i%10 ; > i/=10; > j++; > } > buffer[j] = 0 ; > return buffer; > } >
|
|
Cette discussion est classée dans : int, char, argv, encode, pbitmap
Répondre à ce message
Sujets en rapport avec ce message
char **argv [ par iam_myst ]
bonjour je pense que c'est vraiment un problème de débutant mais la je suis perplexe :( si on a un programme pricipal de ce type : int main(int a
Conversion de char en int ? [ par jnbrunet ]
Salut,Je débute en c++... dans mon programme j'aimerai additionner les valeurs entrées en argument dans le main (argv). Le problème est que la variabl
char**, pointeur et fonction [ par psykocrash ]
Salut,Je bosse sur un petit programme et je butte sur un problème de pointeurs. Voici le code source qui pose problème :--------------------#include #
int main(int argc, char ** argv) [ par agent 047 ]
Bonjour,mon probleme se porte sur le paramètre "char **argv" de la fonction principale utile pour connaître les adresses de chaque argument.Par exempl
Problème en tête bitmap [ par piroman14 ]
Slt tt le monde!Je rencontre un petit problème dans mon algorithme. En effet, je n'arrive pas à coder l'en-tête d'une image bitmap correctement. J'obt
Afficher un Int dans une ListBox ? [ par KroOon ]
Bonjour alors je vous explique mon petit Probléme je débute en Programmation Pour lla Creation d' Applications Windows.Je souhaiterais A partir d' un
matrice de caractere en c [ par flofloo ]
slt tout le monde voici mon probleme : char **Init_Matrice_IrcMSG(int ligne,int colone){ char **mat = NULL; int i; mat =
Objet : ajout et taille [ par scorpion077 ]
Bonjour,j'essai de corriger un DS portant sur la POO. voici mon code:--------------------------------------------------------------------------------#
simplifier prog. [ par F0ra ]
Bonjour,Je cherche de l'aide pour simplifier mon programme au maximumVoici, le contenu du fichier txt :0 1 2 5 3 4 . 1 2 51 1 5 2 2 6 . 9 2 3 2 5 9 8
Sélection d'octet [ par dayvid75014 ]
Bonjour à tous, Je récupère les octets de mon fichier vidéo dans un buffer "Buffer[]" et je voudrais sélectionner les octets 0x47 et je n'y a
Livres en rapport
|
Derniers Blogs
JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|