[C# 2.0] Le Binaire

Signaler
Messages postés
302
Date d'inscription
samedi 22 octobre 2005
Statut
Membre
Dernière intervention
2 novembre 2008
-
Messages postés
302
Date d'inscription
samedi 22 octobre 2005
Statut
Membre
Dernière intervention
2 novembre 2008
-
Bonjour,

j'aimerais pouvoir lire entierement tout le code binaire d'un fichier exe et le reécrire dans un autre fichier ( le cloner ou le generer ) Seulement j'ai quelques questions :

1) Pourquoi il existe plusieurs methodes pour lire un fichier binaire dans un BinaryReader ?
2) Laquel utiliser ? read ? readboolean ?
3) Comment generer un fichier exe comme j'ai dit precedement ?
4) Comment lire entierement le code binaire ?

j'ai essayé de coder ça :
Stream

filestream =
File.Open(dial.FileName,
FileMode.Open,
FileAccess.Read,
FileShare.Read);

BinaryReader binaire =
new
BinaryReader(filestream);

Stream outp =
File.Create(
"test.bmp");

BinaryWriter wb =
new
BinaryWriter(outp);

 wb.Write(binaire.Read());

 

 

Mais sa marche pas.
Merci pour votre aide

12 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Salut,

1 ) BinaryReader c'est pour lire des valeurs spécifiques dans une fichier binaire.. par exemple tu sauvegarde la taille de ta forme avec BinaryWriter et tu peux la relire avec BinaryReader.ReadInt32, vu qu'elle est stockée en Int32.

2 ) Aucune dans ton cas.

3 ) Pour une simple copie, pas besoin d'utiliser un BinaryReader. suffit d'un Filestream pour lire dans la source et un Filestream pour écrire dans la destination, tu remarqueras que j'utilise une boucle et un buffer de 4k, on voit trop souvent des codes qui lisent l'integrale du fichier avant de l'écrire.. imagine si tu dois lire un fichier de 4 Go en mémoire avant de le copier.. bonjour la saturation de la mémoire.

public void Copy( string srcPath, string dstPath )
{
    using ( FileStream srcStream = new FileStream( srcPath, FileMode.Open, FileAccess.Read ) )
    {
        using ( FileStream dstStream = new FileStream( dstPath, FileMode.Create, FileAccess.Write ) )
        {
            int cnt = 0;
            byte[ ] buffer = new byte[ 4096 ];


            while ( true )
            {
                cnt = srcStream.Read( buffer, 0, 4096 );


                if ( cnt > 0 )
                    dstStream.Write( buffer, 0, cnt );
                else
                    break;
            }
        }
    }
}


4 ) Comme dans le code précédent.
Messages postés
302
Date d'inscription
samedi 22 octobre 2005
Statut
Membre
Dernière intervention
2 novembre 2008
4
Merci.
J'aimerais pouvoir générer une  image :

comment stocker son code binaire dans mon programme ?

Bon but serait de générer un fichier exe ou une img pas de le copié
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Tu as dit que tu voulais "le réecrire", "le cloner". c'est pour ça que je t'ai donné cet exemple pour le copier.

Je ne vois pas ce que ça veut dire "stocker son code binaire".. à la rigueur tu peux le lire avec un Filestream et le stocker dans un tableau de bytes, si c'est une image tu peux acceder directement aux pixels via LockBits/UnLockBits.

Tu dis "Générer un fichier exe ou une image" la non plus je vois trop.. les formats images jpg, png, gif etc.. ils n'ont pas la même structure binaire, faut connaitre la structure de chacun, le header, le mode compression etc..pour les fichier exe faut se référer au format COFF.
Messages postés
302
Date d'inscription
samedi 22 octobre 2005
Statut
Membre
Dernière intervention
2 novembre 2008
4
J'aimerais pouvoir faire un exe qui contienne le code binaire d'un autre exe pour le générer à la demande du visiteur.
Un autre truc : j'ai lu des docs sur les header ( par exemple wav ) et j'aimerais pouvoir le recuperer comment faire pour recuperer un header ?

Merci
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
"J'aimerais pouvoir faire un exe qui contienne le code binaire d'un autre exe pour le générer à la demande du visiteur."


Mais quelle est la différence avec une copie ?

"Un autre truc : j'ai lu des docs sur les header ( par exemple wav ) et j'aimerais pouvoir le recuperer comment faire pour recuperer un header ?"

Si tu connais la structure d'un header WAV tu peux créer une structure CSharp identique au header et tu la remplit avec un BinaryReader par exemple. Le header te permet de savoir comment est formaté le reste du fichier.
Messages postés
302
Date d'inscription
samedi 22 octobre 2005
Statut
Membre
Dernière intervention
2 novembre 2008
4
La diference avec la copie c'est que le fichier n'existe pas sur le disque de l'utilisateur c'est lui qui demande à le creer et donc il n'est pas copié il est generé

Oui mais comment le recuperer le header, comment créer une structure csharp ... ?
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Générer un EXE c'est pas simple, les executables Windows sont basés sur le format COFF, j'en sais pas plus..

Un exemple pour lire un header :

public struct Header
{
    public int format;
    public int channel;
    public byte samples;
    public short time;
}


private void ReadHeader( )
{
    using ( FileStream fs = new FileStream( path, FileMode.Open, FileAccess.Read ) )
    {
        using ( BinaryReader br = new BinaryReader( fs ) )
        {
            Header h = new Header( );
            h.format = br.ReadInt32( );
            h.channel = br.ReadInt32( );
            h.samples = br.ReadByte( );
            h.time = br.ReadInt16( );
        }
    }
}
Messages postés
302
Date d'inscription
samedi 22 octobre 2005
Statut
Membre
Dernière intervention
2 novembre 2008
4
Merci pour le code.
Sinon si j'ai le code binaire complet du fichier exe à generer c'est dur à faire ?
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
C'est sur ce point qu'on se comprend pas bien..  Tout dépend de sous quelle forme tu as le code binaire, un tableau de bytes ? Dans ce cas là il te suffit de créer un fichier sur le disque avec l'extension exe et d'écrire le code dedans avec un Filestream.
Messages postés
302
Date d'inscription
samedi 22 octobre 2005
Statut
Membre
Dernière intervention
2 novembre 2008
4
Comment mettre le code binaire sous forme de tableau de byte ?
merci
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
On tourne en rond

"Sinon si j'ai le code binaire complet du fichier exe à generer c'est dur à faire ?"

C'est pour ça que je te demande sous quelle forme tu as le code binaire ??

Alors soit tu sais générer des fichiers EXE à partir de rien, c'est à dire créer, un fichier au Format COFF.. Soit tu pars d'un EXE qui existe déja et dans ce cas je te renvoi à mon premier message qui permettait de copier le contenu d'un EXE dans un tableau de byte de 4ko.

Je veux bien t'aider mais j'ai l'impression qu'on ne se comprend pas.
Messages postés
302
Date d'inscription
samedi 22 octobre 2005
Statut
Membre
Dernière intervention
2 novembre 2008
4
Merci je pars d'un exe qui existe déjà donc je vais prendre le code que tu m'as filé