项目中需要调用.c文件中的一个函数,像这样的
int32_t gpc_prep(uint8_t *input, uint32_t input_len, uint8_t *output, uint32_t output_len)
input和output在java中是两个byte数组,这是我之前做的android项目中的,现在移植到IOS中有一些小问题,input这个数组一个字符串转换成的byte数组,output用来接收一串数据的缓存。在java中input直接用String中的getBytes方法就得到了,IOS中怎么把NSString转成byte数组啊,看了系统里面的方法,有getBytes方法,但是自己试着用总是有问题啊,同样一个字符串,在java中的和xcode中调试得到的数组不一样
我尝试了几个方法
-(NSData *) NSString2Bytes{
    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;
}
还有dataUsingncoding方法,感觉都不太好用啊。
请大神解答下怎么开辟一个byte数组做缓存啊,像C语言中的byte bufbyte[1024]好像有问题啊。

解决方案 »

  1.   


    /**
     * @brief 将字符表示的16进制数转化为二进制数据
     *
     * @param  hexString  字符表示的16进制数,长度必须为偶数
     *
     * @return 二进制数据
     */
    - (NSData *)dataWithHexString:(NSString *)hexString
    {
        // hexString的长度应为偶数
        if ([hexString length] % 2 != 0)
            return nil;
        
        NSUInteger len = [hexString length];
        NSMutableData *retData = [[[NSMutableData alloc] init] autorelease];
        const char *ch = [[hexString dataUsingEncoding:NSASCIIStringEncoding] bytes];
        for (int i=0 ; i<len ; i+=2) {
            
            int height=0;
            if (ch[i]>='0' && ch[i]<='9')
                height = ch[i] - '0';
            else if (ch[i]>='A' && ch[i]<='F')
                height = ch[i] - 'A' + 10;
            else if (ch[i]>='a' && ch[i]<='f')
                height = ch[i] - 'a' + 10;
            else
                // 错误数据
                return nil;
            
            int low=0;
            if (ch[i+1]>='0' && ch[i+1]<='9')
                low = ch[i+1] - '0';
            else if (ch[i+1]>='A' && ch[i+1]<='F')
                low = ch[i+1] - 'A' + 10;
            else if (ch[i+1]>='a' && ch[i+1]<='f')
                low = ch[i+1] - 'a' + 10;
            else
                // 错误数据
                return nil;
            
            int byteValue = height*16 + low;
            [retData appendBytes:&byteValue length:1];
        }
        
        return retData;
    }