【问题标题】:Converting NSString to char byte array将 NSString 转换为 char 字节数组
【发布时间】:2017-03-29 07:41:44
【问题描述】:

在我的程序中,我收到一个类似这样的 NSString:AA010158AA7D385002。我需要将它传递给一个接受 char 字节数组的方法,如下所示:

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

如何将我的 NSString 转换为像这样的 char 字节数组?

谢谢!

【问题讨论】:

  • 你想获取每个单独的 char 字节还是 char?
  • @MianShahbazAkram 在我的示例字符串中,我希望“AA”将结果“0xAA”作为我可以传递到我的 char 数组中的字节。
  • @fraxool bro 我已经更新了答案检查它是否适合你..
  • @Mukesh 我看到你的回答给出了“越界”错误...

标签: objective-c arrays nsstring


【解决方案1】:
 NSString *strCharData = @"AA010158AA7D385002";
 const char *characterRes = [strCharData cStringUsingEncoding:NSUTF8StringEncoding]; 

      or

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

【讨论】:

    【解决方案2】:

    如果我是正确的,请使用这个答案,我几乎没有编码,但可能还有更简单的解决方案,比如@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, 0x02 )

    【讨论】:

    • 这不会像 OP 所要求的那样给出一个 char[9],而是给出一个 NSArray
    • @uliwitness 这是什么意思 NSArray 你能解释一下吗?你知道我们可以通过复制将它转换成 NSArray 并且它也会给出相同的输出。 :D
    • @Mukesh 如果您可以将输出更新为 char[9],我会接受您的回答。
    • @fraxool 欢迎 :) 但我们有 9 个数组对象,这意味着 0..8 索引,祝你好运
    • @fraxool 接受我的回答,如果它对你有帮助的话。
    【解决方案3】:

    由于您的文本是十六进制的,并且您想要实际的字节(每个对应于两个十六进制字符),您必须手动将每个字符转换为相应的数字,然后将它们加在一起成为正确的数值。

    为此,我利用了这样一个事实:在 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");
        }
    }
    

    注意:此代码天真地假设您提供了正确的字符串。 IE。您的输入必须仅包含小写字符和数字,并且必须包含 18 个字符。否则,您会得到错误的结果或异常。

    【讨论】:

      【解决方案4】:

      我终于找到了自己问题的答案。我把它贴在这里以防它帮助别人。

      所以我使用一种方法将 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];
      

      我终于得到了我的 char 数组。希望它可以帮助别人。

      【讨论】:

      • This 帮助了我而不是这个答案。
      猜你喜欢
      • 2012-02-29
      • 2011-04-04
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多