[Résolu] getBytes problème aléatoire

ancrouancrou Membre
juillet 2008 modifié dans API AppKit #1
Bonjour,
Quand je lis mon fichier avec un lecteur hexadécimal je lis :
BA 00 30 00 76 FF 8B FF A2 00 D3 FF AE FF


Dans mon script je fais :
<br />unsigned short val; <br />[data getBytes:&amp;val range:NSMakeRange(loopL, 2)];<br />NSLog(@&quot;val : %X&nbsp; loopL %d&quot;,val,loopL);<br />

et j'ai dans la console :
val : BA00  loopL 1
val : 30[size=10pt]FF[/size]  loopL 3
val : 76FF  loopL 5
val : 8B[size=10pt]00[/size]  loopL 7
val : A2[size=10pt]FF[/size]  loopL 9
val : D3FF  loopL 11
val : AEFF  loopL 13


D'où cela peut il venir ?

Réponses

  • schlumschlum Membre
    16:58 modifié #2
    %X attend un int
  • Philippe49Philippe49 Membre
    juillet 2008 modifié #3
    Un petit essai :

    #import <Foundation/Foundation.h>

    int main(int argc, char**argv){
    NSAutoreleasePool * pool =[[NSAutoreleasePool alloc]init];
    NSData * data=[NSData dataWithBytes:(unsigned char[14]){0xBA ,0, 0x30, 0, 0x76, 0xFF, 0x8B, 0xFF, 0xA2, 0, 0xD3, 0xFF, 0xAE, 0xFF} length:14] ;
    NSInteger loopL;
    for (loopL=0;loopL<14;loopL+=2){
    unsigned short val;
    [data getBytes:&val range:NSMakeRange(loopL, 2)];
    val=Endian16_Swap(val);
    NSLog(@val : %X  loopL %d,val,loopL);
    }
    [pool drain];
    return 0;
    }


    Résultat :
    % gcc pgm.m -o pgm -framework Foundation
    % pgm
    2008-07-21 17:57:20.219 pgm[769:10b] val : BA00  loopL 0
    2008-07-21 17:57:20.221 pgm[769:10b] val : 3000  loopL 2
    2008-07-21 17:57:20.221 pgm[769:10b] val : 76FF  loopL 4
    2008-07-21 17:57:20.222 pgm[769:10b] val : 8BFF  loopL 6
    2008-07-21 17:57:20.222 pgm[769:10b] val : A200  loopL 8
    2008-07-21 17:57:20.223 pgm[769:10b] val : D3FF  loopL 10
    2008-07-21 17:57:20.223 pgm[769:10b] val : AEFF  loopL 12
    %


  • ancrouancrou Membre
    16:58 modifié #4
    Bonjour,

    J'ai comme l'impression que mon buffer est altéré et que mon problème ne vient pas de mon %x ou dataWithBytes ...
    Maintenant, font que je remonte à  la source du buffer  B)
  • ancrouancrou Membre
    16:58 modifié #5
    si je cast un unsigned short* en void*
    cela pourrai expliquer le problème ?
  • schlumschlum Membre
    16:58 modifié #6
    dans 1216721712:

    si je cast un unsigned short* en void*
    cela pourrai expliquer le problème ?


    ça dépend en quoi tu cast ce void* derrière...
    C'est pour ça que j'ai dit que %X prenait un int, car je supposais un problème de cast.
  • ancrouancrou Membre
    16:58 modifié #7
    Difficile à  expliquer:
    J'ai mes données dans un NSData.
    Ces belles données, je les envoie à  une bibliothèque C++
    -(id)initWithData:(NSData*)mData{<br />&nbsp; &nbsp; if(self = [self init]){<br />		const void *buff =[mData bytes];<br />		unsigned long bufLen = [mData length];<br />		glue = new Glue(buff,bufLen);<br />	}<br />&nbsp; &nbsp; return self;<br />}
    


    DicomGlue(const void *buff,unsigned long bufLen);
    


    une fonction me retourne un bloc ces données
    avec : const Uint16* ptr;
    soit un pointeur de type short non-signé.
    Avec ça j'initialise un NSData :

    NSData* data=[[[NSData alloc] initWithBytes:wH.getDataSample() length:wH.getSizeData()]autorelease];
    

  • schlumschlum Membre
    16:58 modifié #8
    Je la sens mal ton histoire de "const Uint16*"
    Déjà , est-ce que ".getSizeData()" ne renverrait pas plutôt le nombre de Uint16 au lieu du nombre de bytes ?
  • ancrouancrou Membre
    16:58 modifié #9
    Pour le value

    OFCondition DcmItem::findAndGetUint16Array(const DcmTagKey & tagKey,
                                                              [glow=red,2,300]const Uint16 *& value,[/glow]
                                                              unsigned long * count = NULL,
                                                              const OFBool searchIntoSub = OFFalse
    )


    find element and get value as an array of unsigned 16-bit integers.

    Applicable to the following VRs: AT, OW, US The result variable 'value' is automatically set to NULL if an error occurs.

    Parameters:
              tagKey DICOM tag specifying the attribute to be searched for
              value variable in which the reference to the element value is stored
              count stores number of items in the result array (if not NULL)
              searchIntoSub flag indicating whether to search into sequences or not
    Returns:
              EC_Normal upon success, an error code otherwise.


    Pour le Size, c'est une autre histoire plus compliquée. Mais s'il est trop grand, j'aurai tout de même mes 1er valeur de bonne, non ?

  • schlumschlum Membre
    16:58 modifié #10
    Plutôt que de faire afficher comme ça, fais un NSLog sur ton NSData voir s'il est cohérent...
  • ancrouancrou Membre
    16:58 modifié #11
    dans 1216729833:

    Plutôt que de faire afficher comme ça, fais un NSLog sur ton NSData voir s'il est cohérent...


    Un NSLog(@%@",mesData);
    me retourne
    <[glow=red,2,300]00[/glow]ba0030 [glow=red,2,300]ff[/glow]76ff8b [glow=red,2,300]00[/glow]a2[glow=red,2,300]ff[/glow]d3 ffaeff50 [glow=red,2,300]00[/glow]6200c4 [glow=red,2,300]01[/glow]1e[glow=red,2,300]00[/glow]c2 00ba0030 [glow=red,2,300]ff[/glow]76ff8b  ...
    Ce qui est faux !
    je devrais avoir :
    BA 00 30 00 76 FF 8B FF A2 00 D3 FF AE FF 50 FF 62 00 C4 00 1E 01 C2 00 BA 00 30 00 76 FF 8B
  • schlumschlum Membre
    juillet 2008 modifié #12
    Ben, y a simplement un bug big endian / little endian...
    Les paires sont tout simplement inversées.
  • ancrouancrou Membre
    16:58 modifié #13
    Bien oui, je suis vraiment à  la rammasse de ne pas l'avoir vu  :'(
    Je devrais aller me coucher  :-\\

    Merci beaucoup
Connectez-vous ou Inscrivez-vous pour répondre.