2017-03-29 2 views
1

Dans mon programme, je reçois un NSString comme celui-ci: AA010158AA7D385002. Et je dois passer à une méthode qui accepte un tableau d'octets char, comme ci-dessous:Conversion de NSString en tableau d'octets de char

char[9] = {0xAA, 0x01, 0x01, 0x58, 0xAA, 0x7D, 0x38, 0x50, 0x02}; 

Comment convertir mon NSString char tableau d'octets comme celui-ci?

Merci!

+0

cochez cette case http://stackoverflow.com/questions/11087031/how-to-convert-an-initwithbytes-nsstring-to-unsigned-char?rq=1 – iOS

+0

Vous souhaitez obtenir des octets char ou char individuels? –

+0

@MianShahbazAkram Dans mon exemple Chaîne, je voudrais que "AA" donne le résultat "0xAA" comme un octet que je peux passer dans mon tableau char. – fraxool

Répondre

0

J'ai finalement réussi à trouver la réponse à ma propre question. Je l'affiche ici au cas où cela aiderait quelqu'un d'autre.

J'utilise une méthode pour convertir un hex NSString à octets:

@implementation NSString (HexToBytes) 

    - (NSData *)hexToBytes 
    { 
     NSMutableData *data = [NSMutableData data]; 
     int    idx; 

     for (idx = 0; idx + 2 <= self.length; idx += 2) { 
      NSRange   range = NSMakeRange(idx, 2); 
      NSString  *hexStr = [self substringWithRange:range]; 
      NSScanner  *scanner = [NSScanner scannerWithString:hexStr]; 
      unsigned int intValue; 
      [scanner scanHexInt:&intValue]; 
      [data appendBytes:&intValue length:1]; 
     } 

     return data; 
    } 

@end 

Et puis, j'utiliser simplement comme ça:

NSString *str = @"AA010158AA7D385002"; 
NSData *databytes = [str hexToBytes]; 
char *bytePtr = (char *)[databytes bytes]; 

Et je enfin obtenir mon tableau de caractères. J'espère que ça aide quelqu'un d'autre.

+0

[This] (https://stackoverflow.com/a/7500472/865175) m'a aidé au lieu de cette réponse. –

1
NSString *strCharData = @"AA010158AA7D385002"; 
const char *characterRes = [strCharData cStringUsingEncoding:NSUTF8StringEncoding]; 

     or 

NSString *strCharData = @"AA010158AA7D385002"; 
const char *characterRes = [strCharData UTF8String]; 
0

Utilisez cette réponse si je ne me trompe pas, je l'ai fait peu de codage, mais peut-être il y a des possibilités de solutions plus simples aussi comme @ user3182143

NSString * inputStr = @"AA010158AA7D385002"; 
NSMutableArray *charByteArray = [[NSMutableArray alloc]initWithCapacity:1]; 
int i = 0; 
for (i = 0; i+2 <= inputStr.length; i+=2) { 

    NSRange range = NSMakeRange(i, 2); 
    NSString* charStr = [inputStr substringWithRange:range]; 
    [charByteArray addObject:[NSString stringWithFormat:@"0x%@",charStr]]; 

} 

Sortie:

omble [9] = ( 0xAA, 0x01, 0x01, 0x58, 0xAA, 0x7D, 0x38, 0x50, 0x02 )

+0

Cela ne donnerait pas un caractère [9] comme le OP demandé, ce qui donnerait un NSArray . – uliwitness

+0

@uliwitness Qu'est-ce que cela signifie NSArray pouvez-vous m'expliquer s'il vous plaît? Vous savez que nous pouvons le convertir en NSArray par copie et il donnera également la même sortie. : D –

+0

@Mukesh Si vous pouvez mettre à jour votre réponse avec la sortie en tant que char [9], j'accepterai votre réponse. – fraxool

0

Étant donné que votre texte est hexadécimal et que vous voulez octets réels sur (qui correspondent chacun à deux caractères hexadécimaux), vous devrez convertir manuellement chaque caractère dans le nombre correspondant, puis les ajouter ensemble dans la bonne valeur numérique. Pour cela, je profite du fait que, en caractères ASCII, a ... z sont alignés, tout comme 0 ... 9. Je profite également du fait que l'hexadécimal est ASCII valide, et que les caractères Unicode de 0 à 127 sont identiques à leurs caractères ASCII correspondants.

Voici un programme qui fait cela et imprime les caractères de chaîne d'origine ainsi que les octets calculés (comme hex à nouveau):

#import <Foundation/Foundation.h> 

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool 
    { 
     NSString *hexStr = @"1234567890abcdef12"; 
     unsigned char theBytes[9] = {}; 
     for(NSUInteger x = 0; x < sizeof(theBytes); x++) 
     { 
      unsigned char digitOne = [hexStr characterAtIndex: x * 2]; 
      if(digitOne >= 'a') 
       digitOne -= 'a' -10; 
      else 
       digitOne -= '0'; 
      unsigned char digitTwo = [hexStr characterAtIndex: (x * 2) +1]; 
      if(digitTwo >= 'a') 
       digitTwo -= 'a' -10; 
      else 
       digitTwo -= '0'; 
      printf("%01x%01x",digitOne,digitTwo); 
      theBytes[x] = (digitOne << 4) | digitTwo; 
     } 
     printf("\n"); 

     for(int x = 0; x < sizeof(theBytes); x++) 
      printf("%02x",theBytes[x]); 
     printf("\n"); 
    } 
} 

Note: Ce code suppose ingénument que vous fournissez une chaîne correcte . C'est à dire. votre entrée doit se composer de caractères minuscules et de chiffres seulement, et exactement 18 caractères. Rien d'autre et vous obtenez un mauvais résultat ou une exception.