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

Langage Delphi Discussion :

Delphi vers c# - byte[]


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut Delphi vers c# - byte[]
    Bonjour !

    Quel type dois-je passer du côté Delphi pour "coller" avec un type byte[] côté c# ?
    Moi j'ai vu que ça devait être tbytearray mais quand je passe celui-ci et que je lis les données côté c# j'ai que 1 byte qui est renseigné

    Nom : Sans titre.png
Affichages : 596
Taille : 6,9 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [DllExport("SaveBlob", CallingConvention = CallingConvention.Cdecl)]        
            public static string SaveBlob(byte[] data, string connectionString, string insertStatement, string parameterName)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    function SaveBlob(aby_data: tbytearray; connectionString: PChar; insertStatement:PChar; parameterName:PChar):PChar; stdcall; external 'SqlCeWrapper.dll';
     
     
     
      Mstream1 := TMemoryStream.Create();
      ImageDefault := TImage.Create(nil);
      ImageDefault.Picture.Bitmap.LoadFromFile(ExtractFilePath(Application.ExeName)+'default.bmp');
      self.Picture.Assign(ImageDefault.Picture.Bitmap);
      self.Picture.SaveToStream( Mstream1);
     
      Mstream1.Position := 0;
      Mstream1.Read(ByteArray[0], Mstream1.Size);
     
      s_error := SaveBlob(ByteArray,PChar('test'),PChar('test'),PChar('test'));
    Avez-vous une idée ?

    merci d'avance les gens !

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Si cela avait été du C++, j'aurais du que le mieux un PByte (^Byte) ou un simple Pointer< donc @ByteArray[0] en paramètre
    Mais en C#, faut le tenter en espérant que le type tableau n'est pas une uzinagaz du GC
    Les string du C# sont vraiment compatible avec de simple PChar ? surprenant !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    hummm pas sur que PByte puisse être compatible avec byte[] car (à priori) ce dernier contient la taille du tableau d'octets alors que PByte n'est qu'un pointeur sans indication de taille.

  4. #4
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Ok j'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ByteArray : PByte;
     
    ByteArray := Mstream1.Memory;
    quand je passe cela, j'ai toujours qu'un byte de renseigné comme sur le photo d'avant grrrrr

  5. #5
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Oui en effet cela ne doit pas être aussi simple que ça, je pense passer par un type PansiChar pour faciliter la chose et du côté c# je m'arrangerai ..

  6. #6
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Il faudrait savoir comment le C# détermine la longueur du tableau de byte.
    Zéro terminal ? ça m'étonnerait sinon le tableau ne pourrait pas contenir d'octets nuls et le nom est bien byte et non pas char...donc je ne crois pas au type Pansichar.
    Dans le c# il faudrait inspecter la zone mémoire de la variable pour voir comment est organisé ce tableau.
    J'ai pu voir que la taille maximum était donnée par un int32, alors peut être que les 4 premiers octets du tableau sont utilisés pour renseigner sur la taille.
    Essaie de passer un pointeur sur un tableau de byte (donc un PByte) contenant 00,00,00,05,01,02,03,04,05 pour voir quel taille le C# retourne.

    exemple de tableau de 5 bytes avec entête de longueur en int32:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Const
      r : array[0..8] of byte = (00,00,00,05,01,02,03,04,05);
    var
      Pb : Pbyte;
    begin
      Pb := @r[0];
    // Appeler ta fonction ici avec Pb en parametre
    (...)

  7. #7
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Salut franckcl,

    En mettant 0 sur les quatre premier octet voilà ce que ça me donne:

    Nom : Sans titre.png
Affichages : 510
Taille : 6,4 Ko

    j'essaie de voir pour lire la zone mémoire de la variable data côté c#

  8. #8
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Ok, donc tu es en train de dire que lorsque les 4 premiers octets sont à zéro, il considère que c'est un tableau de 1 caractère... bizarre
    Ou alors tu peux faire l'inverse c# vers delphi ? mais j'imagine que c'est plus compliqué à mettre en oeuvre.

  9. #9
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Peu importe ce que j'ai essayé j'ai toujours eu qu'un octet de visible côté c#, la piste est bonne mais faut que je trouve comment lui renseigner la longueur en effet

  10. #10
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par phoenixgreg Voir le message
    Peu importe ce que j'ai essayé j'ai toujours eu qu'un octet de visible côté c#, la piste est bonne mais faut que je trouve comment lui renseigner la longueur en effet
    Ne serait-ce pas un problème de l'évaluateur ?
    En delphi, c'est pareil, pour certains type il n'affiche que le premier élément car il ne connait pas le nombre à afficher.
    Essaye de parcourir le tableau coté c# voir si le contenu est correct, plutôt qu'assumer que l'évaluateur a raison.
    Attention au passage, ta convention d'appel stdcall est différente de celle de la dll cdecl (sensiblement les même, juste la libération mémoire n'est pas à la charge du même coté)

  11. #11
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Salut guillemouze,

    oui absolument, je n'ai pas eu le temps de vérifier ça, pour le moment j'ai fait un truc moche, càd de créer un fichier côté delphi avec le binaire puis de le lire côté c# et jouer avec... mouai..

Discussions similaires

  1. Réponses: 7
    Dernier message: 30/09/2005, 17h53
  2. [Kylix] Portage d'application Delphi vers Kylix
    Par BONNEFOI Patrick dans le forum EDI
    Réponses: 4
    Dernier message: 03/05/2005, 22h35
  3. Passage de variables de DELPHI vers RAVE
    Par e120650 dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/02/2005, 12h17
  4. [Kylix] De delphi vers Kylix : Et les HLP ?
    Par Beuz dans le forum EDI
    Réponses: 1
    Dernier message: 11/06/2002, 11h38
  5. Réponses: 1
    Dernier message: 13/05/2002, 09h19

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