Write/Read Bytes

iTom-ciTom-c Membre
Bonjour à  tous et à  toutes,

Alors voilà , je recherche un framework ou une classe comme il y a dans Java pour utiliser des fonctions comme :

writeString
writeByte
writeBytes
writeShort
writeInt
writeDouble
writeBoolean

et à  l'inverse les lire aussi.

Par exemple j'ai ces 3 variables :

unsigned short int 7890 (base 10) => 1E D2 (base 16)
int 123456 => 00 01 E2 40
unsigned char 95 => 5F


J'ai besoin de créer la fonction représenté par => et à  l'inverse <=
Le but final sera d'envoyer/recevoir une NSData (via un NSStream) contenant ces 3 variables donc : 1E D2 00 01 E2 40 5F

Réponses

  • AliGatorAliGator Membre, Modérateur
    octobre 2010 modifié #2
    Hello & Welcome

    Tu trouveras sans doute les réponses à  tes questions Dans le Binary Data Programming Guide

    Après, je pense que tu confonds les données et sa représentation. 7890 et 0x1ED2 sont exactement la même chose. Quand tu veux envoyer des octets via un NSStream, tu envoies des octets, que toi sur le papier tu les écrives 7890 ou Ox1ED2 ça reste des octets. Tu n'envoies pas la chaà®ne "1ED2" (qui serait un stream composé des caractères/octets "1" puis "E" puis "D" puis "2"), tu envoies un octet de valeur 30, soit 0x1E en hexa, puis tu envoies l'octet de valeur 210 (soit 0xD2 si tu préfères la représentation hexa). Tu n'as pas à  avoir une fonction qui convertit 7890 en 0x1ED2 vu que c'est la même chose en fait. Par contre tu veux une méthode qui décompose une donnée en sa représentation en octets (représentation BigEndian apparemment d'après ce que tu décris)

    Donc en particulier pour ce que tu veux faire il suffit d'utiliser la classe NSMutableData et sa méthode appendBytes:length: :
    unsigned short int usi = 7890;<br />// on peut tout aussi bien écrire &quot;unsigned short int usi = 0x1ED2;&quot; d&#39;ailleurs<br />int i = 0x0001E240; // ou int i = 123456; c&#39;est pareil<br />unsigned char uc = 95;<br /><br />NSMutableData* data = [[NSMutableData alloc] init];<br />[data appendBytes:&amp;usi length:sizeof(usi)]; // ou sizeof(unsigned short int) à  la limite<br />[data appendBytes:&amp;i length:sizeof(i)]; // ou sizeof(int) c&#39;est même plus explicite<br />[data appendBytes:&amp;c length:sizeof(c)]; // ou sizeof(char)<br />// do sthg with data<br />// genre là  tu peux envoyer ton NSData via un NSStream<br />[data release];
    
  • iTom-ciTom-c Membre
    octobre 2010 modifié #3
    En fait, je me suis mal exprimé désolé, je ne confond pas les données et leur représentation.
    Mais par exemple je ne comprend pas comment cela marche (en Java) :

    <br />&nbsp; &nbsp; &nbsp; &nbsp; public int x = 2;<br />	public int y = 2;<br />	public int z = 1;<br />	public int t = 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; param.writeByte(x);<br />		param.writeByte(y);<br />		param.writeShort(z);<br />		param.writeByte(t);<br />
    


    Le packet envoyé sera 02 02 00 01 00 et c'est correct. Alors qu'en Objective-c :

    <br />&nbsp; &nbsp; &nbsp; &nbsp; int x = 2;<br />	int y = 2;<br />	int z = 1;<br />	int t = 0;<br /><br />NSMutableData* data = [[NSMutableData alloc] init];<br />[data appendBytes:&amp;x length:sizeof(x)];<br />[data appendBytes:&amp;y length:sizeof(y)];<br />[data appendBytes:&amp;z length:sizeof(z)];<br />[data appendBytes:&amp;t length:sizeof(t)];
    


    Et la le packet envoyé sera 02 00 00 00 02 00 00 00 01 00 00 00 00 00 00 00.
  • NseaProtectorNseaProtector Membre
    12:57 modifié #4
    Bonjour,
    Essayes avec des "char", il me semble que c'est ce que tu cherches ...
  • iTom-ciTom-c Membre
    12:57 modifié #5
    Merci de ton aide, mais avec des "char" j'obtiendrais 02 02 01 00

    En fait je crois que une partie du problème vient de la différence entre le writeByte et le writeShort que je ne comprend pas.
  • devulderdevulder Membre
    12:57 modifié #6
    dans 1286693363:

    Merci de ton aide, mais avec des "char" j'obtiendrais 02 02 01 00

    En fait je crois que une partie du problème vient de la différence entre le writeByte et le writeShort que je ne comprend pas.


    Si tu veux ecrire un short

    short  int  = 1;

    [data appendBytes:&y length:sizeof(z)];

  • mpergandmpergand Membre
    12:57 modifié #7
    ATTENTION, la taille des entiers en C est fonction du compilateur et de l'achitecture processeurs (32/64 bits)

    char c;
    short s;
    int i;
    long l;

    printf("char %d short %d int %d long %d\n",sizeof(c),sizeof(s),sizeof(i),sizeof(l));;


    sur une machine 32 bits cela donne: char 1 short 2 int 4 long 4

    Pour avoir des tailles déterminées, on peut utiliser :

    UInt8 c;
    UInt16 s;
    UInt32 i;
    SInt64 l;

    printf("char %d short %d int %d long %d\n",sizeof(c),sizeof(s),sizeof(i),sizeof(l));


    Ce qui donne: char 1 short 2 int 4 long 8

    On peut aussi vouloir définir les tailles soi-même:

    #include <machine/types.h>

    typedef int8_t BYTE;
    typedef u_int8_t UBYTE;

    typedef int16_t WORD;
    typedef u_int16_t UWORD;

    typedef int32_t INT;
    typedef u_int32_t UINT;

    typedef int64_t LONG;
    typedef u_int64_t ULONG;


    typedef int16_t INT16;
    typedef u_int16_t UINT16;

    typedef int32_t INT32;
    typedef u_int32_t UINT32;

    typedef int64_t INT64;
    typedef u_int64_t UINT64;


  • iTom-ciTom-c Membre
    12:57 modifié #8
    Merci à  tous, j'ai lu tout ce que je pouvais trouver, et maintenant j'ai bien tout compris, merci ! 
Connectez-vous ou Inscrivez-vous pour répondre.