Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何将NSString转换为uint8\t数组_Iphone_Objective C - Fatal编程技术网

Iphone 如何将NSString转换为uint8\t数组

Iphone 如何将NSString转换为uint8\t数组,iphone,objective-c,Iphone,Objective C,我有这样一个NSString:850210 如何将其转换为uint8_t data[]={0x85,0x02,0x10} 有人能帮我解决这个问题吗 比尔, 请在字符串上循环,并首先检查长度小于3的字符串。如果它只是简单地调用NSString本身的intValue,那么您就有了第一个也是唯一一个字节 如果大于或等于3,则从读取三个数字开始,并检查其是否大于255。如果在两个字节中重新读取,则检查它们的值,这是一个字节。如果不是,那么取前三个数字,这是一个字节 对剩余的字符串重复此过程(忽略已读入的

我有这样一个NSString:850210

如何将其转换为uint8_t data[]={0x85,0x02,0x10}

有人能帮我解决这个问题吗

比尔,
请在字符串上循环,并首先检查长度小于3的字符串。如果它只是简单地调用NSString本身的intValue,那么您就有了第一个也是唯一一个字节

如果大于或等于3,则从读取三个数字开始,并检查其是否大于255。如果在两个字节中重新读取,则检查它们的值,这是一个字节。如果不是,那么取前三个数字,这是一个字节

对剩余的字符串重复此过程(忽略已读入的数字创建的字符串)

祝你好运:)


我假设字符串是十进制格式的。如果是十六进制,那么一次只需读入两个数字。用这个问题来帮助你:


第二次编辑:

我尚未对此进行测试,但如果存在任何错误,则应易于修复:

NSString *hexString = @"8510A0";
uint8_t *result = (uint8_t *)malloc(sizeof(uint8_t) * ([hexString length] / 2));
for(int i = 0; i < [hexString length]; i += 2) {
    NSRange range = { i, 2 };
    NSString *subString = [hexString subStringWithRange:range];
    unsigned value;
    [[NSScanner scannerWithString:subString] scanHexInt:&value];
    result[i / 2] = (uint8_t)value;
}
// result now contains what you want
free(result)
NSString*hexString=@“8510A0”;
uint8_t*结果=(uint8_t*)malloc(sizeof(uint8_t)*([hextstring length]/2));
对于(int i=0;i<[hextstring length];i+=2){
NSRange range={i,2};
NSString*subString=[hexString subStringWithRange:range];
无符号值;
[[NSScanner scannerWithString:subString]scanHexInt:&value];
结果[i/2]=(uint8_t)值;
}
//结果现在包含您想要的内容
免费(结果)
#导入
静态NSString*常量hexString=@“850210”;
int main(int argc,const char*argv[]
{
NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
uint8_t数据[3]={0};
const char*theUniChar=hexString.UTF8String;
对于(int i=0,c=(int)strlen(theUniChar)/2;i
这个问题可能会帮助您:这是一个重复的问题。您好,谢谢您的建议,如果我可以一次读两个,如何将其放入uint8_t数组??如何将字符串转换为uint8_t#Hi,直到值正确,但结果错误。我正在将其打印为%c,但未获得所需的结果。怎么了?你有没有调试过以检查结果?我认为您可能必须像这样将索引转换为结果:(int)(I/2),然后在完成后不要忘记释放(result)。将其打印为%c将使用该特定代码打印ascii字符。。。。(我在示例中放的字符串与你的不同)是的,我检查了结果,结果始终保持85,当其A0显示为0时,它的值为0。哈哈,是的,对不起,我现在意识到我的错误。我将编辑答案。非常感谢,这很有效,但是如果您想要前导零,我使用了“%02X”和theNum&0xFF;将转换回十六进制。
#import <Foundation/Foundation.h>
static NSString * const hexString = @"850210";

int main (int argc, const char * argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    uint8_t         data[3]={0};
    const char      * theUniChar = hexString.UTF8String;

    for( int i = 0, c = (int)strlen(theUniChar)/2; i < c && i < sizeof(data)/sizeof(*data); i++ )
    {
        int     theNum = 0;
        sscanf( theUniChar + 2*i, "%2x", &theNum );
        data[i] = theNum;
    }

    printf( "{%x,%x,%x}\n", data[0],data[1],data[2] );


    [pool drain];
    return 0;
}