将NSString转换为char字节数组

时间:2017-03-29 07:41:44

标签: objective-c arrays nsstring

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

MainWidget::MainWidget(QWidget* parent) : QWidget(parent)
{
   ui.setupUi(this);
   theLabel->installEventFilter(this);
} 

bool MainWidget::eventFilter(QObject* o, QEvent* e)
{
    if(e->type() == QEvent::Resize)
    {
        //manage the resize event
    }
    return false;
}

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

谢谢!

4 个答案:

答案 0 :(得分:1)

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

      or

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

答案 1 :(得分: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]];

}
  

输出

     

char [9] =(       和0xAA,       0×01,       0×01,       将0x58,       和0xAA,       0x7D,       0x38,       为0x50,       0×02   )

答案 2 :(得分:0)

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

要做到这一点,我正在利用这样一个事实:在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个字符。其他任何事情都会导致错误的结果或异常。

答案 3 :(得分: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];

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