2017-03-29 152 views
1

在我的程序中,我收到了一個如下所示的NSString:AA010158AA7D385002。我需要它傳遞給它接受一個字符字節數組的方法,如下:將NSString轉換爲char字節數組

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

如何把我的NSString轉換爲char字節數組像這樣的?

謝謝!

+0

檢查此問題http://stackoverflow.com/questions/11087031/how-to-convert-an-initwithbytes-nsstring-to-unsigned-char?rq=1 – iOS

+0

你想獲得每個單獨的char字節或char? –

+0

@MianShahbazAkram在我的例子字符串中,我想「AA」將結果「0xAA」作爲一個字節,我可以在我的char數組中傳遞。 – fraxool

回答

0

我終於設法找到了我自己的問題的答案。我在這裏發佈它,以便它可以幫助別人。

所以我用的方法來一個NSString十六進制轉換爲字節:

@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 

然後,我只是用它這樣的:

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

現在我終於有了我的字符數組。希望它可以幫助別人。

+0

[This](https://stackoverflow.com/a/7500472/865175)幫助我而不是這個答案。 –

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

     or 

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

使用這個答案,如果我是正確的,我做一點的編碼,但可能也有簡單的解決方案的可能性也很喜歡@ 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]]; 

} 

輸出:

字符[9] =( 0xAA, 0x01, 0x01, 0x58, 和0xAA, 0x7D, 0x38, 爲0x50, 0×02 )

+0

這不會像OP問的那樣給出一個char [9],那會給NSArray 。 – uliwitness

+0

@uliwitness這是什麼意思NSArray 你能解釋我嗎?你知道我們可以通過複製將它轉換成NSArray,它也會給出相同的輸出。 :D –

+0

@Mukesh如果你可以通過輸出作爲char [9]來更新你的答案,我會接受你的答案。 – fraxool

0

由於您的文字是十六進制,你想實際字節出(各自對應於兩個十六進制字符),你必須手動轉換將每個字符放入相應的數字中,然後將它們一起添加到正確的數值中。

要做到這一點,我利用了這樣一個事實:在ASCII字符中,a ... z連續,0 ... 9。我還利用了十六進制是有效ASCII的事實,並且從0到127的Unicode字符與它們對應的ASCII字符相同。

下面是一個程序,(再次爲十六進制)做到這一點,並打印出原始字符串的字符以及計算的字節:

#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"); 
    } 
} 

注:此代碼天真地假設你提供一個正確的字符串。即您的輸入只能包含小寫字符和數字,並且只能包含18個字符。任何其他事情,你會得到一個錯誤的結果或例外。