IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Silverlight Discussion :

Problème de conversion en Base64


Sujet :

Silverlight

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 496
    Par défaut Problème de conversion en Base64
    Bonjour,

    Je cherche à transférer des fichiers binaire en JSON donc j'encode ces derniers en base64 sauf que mes fichiers décodés sont différents des originaux.
    J'ai fait un test d'encodage et de décodage à la suite mais j'ai le même problème :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                size = (int)p.file.Length;
                RawData = new byte[size];
                FileStream s = p.file.OpenRead();
                s.Read(rawdata, 0, Size);
                string data = Convert.ToBase64String(RawData, 0, size);
                MessageBox.Show("same (from base64) ? " + rawdata.Equals(Convert.FromBase64String(data)));
    J'ai mon alerte qui me dit False

  2. #2
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Cela ne vient pas des méthodes FromBase64String et ToBase64String.

    Tu obtiens cette différence car tu compares des tableaux et pas des strings. Tu compares donc l'adresse mémoire des tableaux et pas leurs valeurs :

    Si on reprend ton code en lui rajoutant une méthode de comparaison liée aux valeurs internes de tes tableaux on s'aperçoit que ce sont bien les mêmes :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
                OpenFileDialog dialog = new OpenFileDialog();
     
                if (dialog.ShowDialog() == true)
                {
                    int size = (int)dialog.File.Length;
                    byte[] rawData = new byte[size];
                    System.IO.FileStream s = dialog.File.OpenRead();
                    s.Read(rawData, 0, size);
                    string data = Convert.ToBase64String(rawData, 0, size);
     
                    bool isDifferent = false;
                    byte[] rawDataReturn = Convert.FromBase64String(data);
     
                    if (rawData.Length == rawDataReturn.Length)
                    {
                        for (int index = 0; index < rawData.Length; index++)
                        {
                            if (rawData[index] != rawDataReturn[index])
                            {
                                isDifferent = true;
                            }
                        }
                    }
                    else
                    {
                        isDifferent = true;
                    }
     
                    System.Diagnostics.Debug.WriteLine("Is Different (from base64) ? " + isDifferent );
                }

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 496
    Par défaut
    Merci Samuel, je n'ai plus de problème de ce côté la.

    Par contre, quand je décode du côté PHP, mes fichiers sont différents :

    Voici le code PHP qui décode :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?php
    class ImageFile {
    	public $filename;
    	public $size;
    	public $data;
    }
    if(!empty($_POST['image'])){
    	$image=json_decode($_POST['image']);
    	unlink('tmp/'.$image->filename);
    	$fh=fopen('tmp/'.$image->filename, 'wb');
    	fwrite($fh, base64_decode($image->data));
    	fclose($fh);
    	$fh=fopen('files.txt', 'a');
    	fwrite($fh, date('Y-m-d H:i:s')."\t".$image->filename.' '.$image->size." bytes (Copy size: ".filesize('tmp/'.$image->filename)." bytes)\n");
    	fclose($fh);
    }
    ?>
    Et le C#qui encode mon image en JSON :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Picture p = Files[i];
                p.Uploading = true;
                FileToUpload f=new FileToUpload(p);
                wc.Headers["Content-Type"] = "application/x-www-form-urlencoded";
                wc.UploadStringAsync(new Uri(destination), "Post", "image=" + modules.JSON.Serialize(f));

  4. #4
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    c'est sans doute lié à :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    modules.JSON.Serialize(f)

    et


    qui ne fonctionnent peut être pas de la même façon.

    Si tu as la possibilité, pourquoi ne pas passer directement ta chaine en base64 dans la querystring ?

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 496
    Par défaut
    Voici ma fonction Serialize :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            public static string Serialize(object obj)
            {
                MemoryStream ms = new MemoryStream();
                DataContractJsonSerializer s = new DataContractJsonSerializer(obj.GetType());
                s.WriteObject(ms, obj);
                byte[] json = ms.ToArray();
                ms.Close();
                return Encoding.UTF8.GetString(json, 0, json.Length);
            }
    J'ai aussi changé une ligne PHP du coup :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    	$image=json_decode(utf8_decode($_POST['image']));

    Mais rien n'a changé

    Si tu as la possibilité, pourquoi ne pas passer directement ta chaine en base64 dans la querystring ?
    Je ne suis pas tout seul sur le projet et ici j'envoie des images 1 par 1 mais par la suite, j'aurai besoin d'envoyer un objet contenant beaucoup d'informations et un fichier binaire.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 496
    Par défaut
    Citation Envoyé par Samuel Blanchard Voir le message
    Si tu as la possibilité, pourquoi ne pas passer directement ta chaine en base64 dans la querystring ?
    Finalement, après réunion avec mes collaborateurs, cette méthode a été adoptée.
    Je vais essayer ça aujourd'hui

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 496
    Par défaut
    J'ai toujours le même problème même en passant dans la query string :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                wc.Headers["Content-Type"] = "application/x-www-form-urlencoded";
                wc.UploadStringAsync(new Uri(destination), "Post", "type=" + f.type + "&sha1=" + f.sha1 + "&sha1_parent=" + f.sha1_parent + "&data=" + f.data);

  8. #8
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par Samuel Blanchard Voir le message
    Si on reprend ton code en lui rajoutant une méthode de comparaison liée aux valeurs internes de tes tableaux on s'aperçoit que ce sont bien les mêmes :
    Il y'a plus simple pour comparer des tableaux: Enumerable.SequenceEqual<TSource> Method (IEnumerable<TSource>, IEnumerable<TSource>)
    http://msdn.microsoft.com/en-us/library/bb348567.aspx

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème de conversion de dimension dans BUSINESS OBJECT
    Par greatmaster1971 dans le forum Deski
    Réponses: 4
    Dernier message: 28/04/2014, 13h15
  2. - [CAST ou CONVERT] Problème de conversion de date
    Par Boublou dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/07/2004, 14h31
  3. Problème de conversion 3DS->.X
    Par JBernn dans le forum DirectX
    Réponses: 5
    Dernier message: 08/04/2004, 19h08
  4. Problème de conversion unicode
    Par djmalo dans le forum C
    Réponses: 5
    Dernier message: 09/03/2004, 11h48
  5. Réponses: 11
    Dernier message: 02/09/2003, 14h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo