将 NSString 转换为 char 字节数组

Converting NSString to char byte array

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

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

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

谢谢!

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

      or

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

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

}

Output :

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

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

为此,我利用了这样一个事实:在 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 个字符。任何其他事情都会得到错误的结果或异常。

我终于找到了我自己问题的答案。我将它张贴在这里以防它对其他人有帮助。

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

我终于得到了我的字符数组。希望对其他人有帮助。