在目标C中将十六进制数据字符串转换为NSData(可可)

Max*_*rke 10 iphone cocoa hex objective-c nsdata

相当新的iPhone开发人员.构建一个应用程序,通过TCP/IP套接字连接向设备发送RS232命令.我已经将通信部分关闭,并且可以发送ASCII命令.这是我遇到问题的十六进制代码命令.

所以我要说我要发送以下十六进制数据(采用这种格式):

\ X1C\x02d\X00\X00\X00\XFF\0x7F部分

如何将其转换为我的send方法所期望的NSData对象?

显然这对于​​这个十六进制数据不起作用(但是对于标准的ascii命令):

NSString *commandascii;
NSData *commandToSend;
commandascii = @"\x1C\x02d\x00\x00\x00\xFF\x7F";
commandToSend = [commandascii dataUsingEncoding:NSStringEncoding];
Run Code Online (Sandbox Code Playgroud)

首先,一些\ x十六进制代码是转义字符,在XCode中编译时,我收到"输入转换已停止..."警告.并且NSStringEncoding显然不适合这个十六进制字符串.

所以第一个问题是如何存储这个十六进制字符串我猜,然后如何转换为NSData.

有任何想法吗?

Max*_*rke 30

NSStrings中的十六进制代码,如"00 05 22 1C EA 01 00 FF".'command'是十六进制NSString.

command = [command stringByReplacingOccurrencesOfString:@" " withString:@""];
NSMutableData *commandToSend= [[NSMutableData alloc] init];
unsigned char whole_byte;
char byte_chars[3] = {'\0','\0','\0'};
for (int i = 0; i < ([command length] / 2); i++) {
    byte_chars[0] = [command characterAtIndex:i*2];
    byte_chars[1] = [command characterAtIndex:i*2+1];
    whole_byte = strtol(byte_chars, NULL, 16);
    [commandToSend appendBytes:&whole_byte length:1]; 
}
NSLog(@"%@", commandToSend);
Run Code Online (Sandbox Code Playgroud)


xyz*_*der 9

这是在NSString上的类别上实现的示例解码器.

#import <stdio.h>
#import <stdlib.h>
#import <string.h>

unsigned char strToChar (char a, char b)
{
    char encoder[3] = {'\0','\0','\0'};
    encoder[0] = a;
    encoder[1] = b;
    return (char) strtol(encoder,NULL,16);
}

@interface NSString (NSStringExtensions)
- (NSData *) decodeFromHexidecimal;
@end

@implementation NSString (NSStringExtensions)

- (NSData *) decodeFromHexidecimal;
{
    const char * bytes = [self cStringUsingEncoding: NSUTF8StringEncoding];
    NSUInteger length = strlen(bytes);
    unsigned char * r = (unsigned char *) malloc(length / 2 + 1);
    unsigned char * index = r;

    while ((*bytes) && (*(bytes +1))) {
        *index = strToChar(*bytes, *(bytes +1));
        index++;
        bytes+=2;
    }
    *index = '\0';

    NSData * result = [NSData dataWithBytes: r length: length / 2];
    free(r);

    return result;
}

@end
Run Code Online (Sandbox Code Playgroud)