Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.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 转换;“字符串”;将二进制文件转换为文本字符串_Iphone_Objective C_Binary_Nsstring_Ascii - Fatal编程技术网

Iphone 转换;“字符串”;将二进制文件转换为文本字符串

Iphone 转换;“字符串”;将二进制文件转换为文本字符串,iphone,objective-c,binary,nsstring,ascii,Iphone,Objective C,Binary,Nsstring,Ascii,我能够将NSString(ASCII)文本转换为NSString(二进制数),但在做相反的事情时遇到困难。例如:“Hi”变为“01101000 011001” 我正在寻找最直接的方法来实现这一点。请注意每8位二进制数之间的空格。考虑到格式始终是这样的,此代码应该可以工作: NSString * BinaryToAsciiString (NSString *string) { NSMutableString *result = [NSMutableString string]; c

我能够将NSString(ASCII)文本转换为NSString(二进制数),但在做相反的事情时遇到困难。例如:“Hi”变为“01101000 011001”

我正在寻找最直接的方法来实现这一点。请注意每8位二进制数之间的空格。

考虑到格式始终是这样的,此代码应该可以工作:

NSString *
BinaryToAsciiString (NSString *string)
{
    NSMutableString *result = [NSMutableString string];
    const char *b_str = [string cStringUsingEncoding:NSASCIIStringEncoding];
    char c;
    int i = 0; /* index, used for iterating on the string */
    int p = 7; /* power index, iterating over a byte, 2^p */
    int d = 0; /* the result character */
    while ((c = b_str[i])) { /* get a char */
        if (c == ' ') { /* if it's a space, save the char + reset indexes */
            [result appendFormat:@"%c", d];
            p = 7; d = 0;
        } else { /* else add its value to d and decrement
                  * p for the next iteration */
            if (c == '1') d += pow(2, p);
            --p;
        }
        ++i;
    } [result appendFormat:@"%c", d]; /* this saves the last byte */

    return [NSString stringWithString:result];
}
告诉我是否有部分不清楚。

这是怎么回事

NSString* stringFromBinString(NSString* binString) {
    NSArray *tokens = [binString componentsSeparatedByString:@" "];
    char *chars = malloc(sizeof(char) * ([tokens count] + 1));

    for (int i = 0; i < [tokens count]; i++) {
        const char *token_c = [[tokens objectAtIndex:i] cStringUsingEncoding:NSUTF8StringEncoding];
        char val = (char)strtol(token_c, NULL, 2);
        chars[i] = val;
    }
    chars[[tokens count]] = 0;
    NSString *result = [NSString stringWithCString:chars 
                                          encoding:NSUTF8StringEncoding];

    free(chars);
    return result;
}
NSString*stringFromBinString(NSString*binString){
NSArray*标记=[binString组件由字符串分隔:@”“];
char*chars=malloc(sizeof(char)*([tokens count]+1));
对于(int i=0;i<[令牌计数];i++){
const char*token_c=[[tokens objectAtIndex:i]cStringUsingEncoding:NSUTF8StringEncoding];
char val=(char)strtol(标记c,NULL,2);
chars[i]=val;
}
字符[[tokens count]]=0;
NSString*result=[NSString stringWithCString:chars
编码:NSUTF8StringEncoding];
免费(chars);
返回结果;
}

(以社区维基的形式发布-我以前的skool C技能已经过时了-请随意清理一下。:-)

你有权使用C函数
strtoul
?很好!如果没有字符串分离的
组件,这是不可能的:
@ap0stlex:很高兴它达到了您的要求。除了
[result appendFormat:…]
,这只是由Objective-C包装的纯C。它可能具有多字节字符,但由于您使用ASCII,因此在C中很容易处理。
NSString* stringFromBinString(NSString* binString) {
    NSArray *tokens = [binString componentsSeparatedByString:@" "];
    char *chars = malloc(sizeof(char) * ([tokens count] + 1));

    for (int i = 0; i < [tokens count]; i++) {
        const char *token_c = [[tokens objectAtIndex:i] cStringUsingEncoding:NSUTF8StringEncoding];
        char val = (char)strtol(token_c, NULL, 2);
        chars[i] = val;
    }
    chars[[tokens count]] = 0;
    NSString *result = [NSString stringWithCString:chars 
                                          encoding:NSUTF8StringEncoding];

    free(chars);
    return result;
}