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

C# Discussion :

[.NET 2.0] Encodage des caractères ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de OtI$
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Par défaut [.NET 2.0] Encodage des caractères ?
    Salut!

    Suite à une discussion que j'avais eu avec certains au sujet de l'interaction entre deux progs C++ et C#, j'ai développé une petite solution qui semblait marchait, sauf pour une chose:

    Je cherche a récupérer des valeurs depuis ma mémoire pour les mettre dans des struct C#. Je passe par du code non managé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    unsafe {
    TDefines.cs_mktFile_pub.Data_Basket dataBasket;
    TDefines.cs_mktFile_pub.CopyMemory(&dataBasket, Footer, 256+16);
    Console.WriteLine(new String(dataBasket.Author));                                    Console.WriteLine(dataBasket.SubjectGuid.ToString());
    }
     
    //Fction CopyMemory, dans un autre fichier
    [DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern void CopyMemory(void* dst, byte[] src, int len);
    Donc ce code copie bien des choses depuis la mémoire, mais des choses illisibles.
    Ainsi, l'auteur devrait être 'toto' par exemple, et il me copie la chaine '???m' par exemple.
    de meme, le Guid qu'il me copie est uniquement constitué de 0.

    Est ce un problème d'encodage ? Il y a t il une aberration dans mon code que je ne vois pas?

    Merci pour votre aide

  2. #2
    Membre Expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Par défaut
    Je vois de quelle discution tu parles.

    Est-ce que tu ne lirais pas l'entête de la structure (si tnt est qu'il y en ai un...)

    Essaie d'afficher directement le contenu de toute ta mémoire (enfin pas tout tout tout, juste le bloc interressant pour repérer les valeurs)

  3. #3
    Membre confirmé Avatar de OtI$
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Par défaut
    Salut!

    Je ne pense pas que cela vienne de la lecture en mémoire, car si j'examine mon byte[] avec mon debugger et que je fais une rapide conversion ASCII je m'apercois que mon tableau est correctement organisé, donc que la lecture s'est bien passée.
    ex:
    [0] = 't'
    [1] = 'o'
    [2] = 't'
    [3] = 'o'

    C'est après cette étape que, lorsque j'essaye de copier l'espace mémoire de ce byte[] vers ma structure qu'il fait n'importe quoi.

    D'ailleurs, au passage, est ce qu'une structure C# est organisée de la meme manière en mémoire qu'une structure C++?

    il me semble que:
    en C++:
    struct tutu{
    int toto;
    char tata;
    }

    donne en mémoire 4 octets pour mon int suivi immédiatement de 2 octet pour mon char, sans fioritures ...

  4. #4
    Membre Expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Par défaut
    Très surement, non la gestion en mémoire n'est pas la même..
    Mais connais - tu à l'avance le format de ta structure ?

    Si oui, "maStructCSharp.monchamps = val;" ca va marcher Mais si tu en est la c'est que surement tu n'as pas à l'avance la description de la structure...

    Et dans ce cas tu peux employer la reflexion:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // i variable de boucle
      //lecture du byte[] et stockage dans une variable 'val'. 
      Type t = mastructCSharp.GetType();
      t.SetProperty(t.GetProperty[i],mastructCSharp,val);
    mais tu aura des problème de cast.... Dis moi en plus pour que je puisse t'aider mieux..

  5. #5
    Membre confirmé Avatar de OtI$
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Par défaut
    En fait, j'ai déja essayé la réflexion, et ca a fait l'objet d'une discussion précédente.

    Là, j'aimerais vraiment pouvoir utiliser un copymemory, si c'est possible.

    Par ailleurs, si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // i variable de boucle
      //lecture du byte[] et stockage dans une variable 'val'. 
      Type t = mastructCSharp.GetType();
      t.SetProperty(t.GetProperty[i],mastructCSharp,val);
    comment la fonction Setproperty va t elle savoir combien d'octets doivent aller dans le champ?

    Si j'ai bien compris, val représente ici le byte[] dans sa globalité globale lol et donc si le t.GetProperty[i] c'est un int, comment la fonction sait qu'elle doit utiliser les 4 premiers octets du byte[] ? Et ainsi de suite, est ce qu'elle gere un intérateur pour connaitre la position de lecture dans le tableau (pour pouvoir enchainer la lecture de N octets suivants pour les champs à venir) ?

    Merci

  6. #6
    Membre Expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Par défaut
    Me suis mal exprimé

    val contient les 4 octets de ton int.
    ou l'octet de ton char.

    Evidemment tu ne peux faire cela qu'en connaissant à l'avance la description de la structure.

Discussions similaires

  1. [MySQL] Encodage des caractères sous php4 lors de reception
    Par UN|X` dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/04/2007, 15h50
  2. [mysql]encodage des caractères
    Par ideal23 dans le forum Requêtes
    Réponses: 4
    Dernier message: 27/10/2006, 13h16
  3. Probleme d'encodage des caractères spéciaux
    Par pacoulitou24 dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 20/06/2006, 16h47
  4. Réponses: 15
    Dernier message: 24/02/2006, 14h17

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