Преобразовать "строку" из двоичного файла в строку текста - PullRequest
2 голосов
/ 27 июня 2011

Я могу преобразовать NSString из текста (ASCII) в NSString двоичных чисел, но у меня возникают проблемы с выполнением противоположного.Например: «Привет» становится «01101000 01101001».

I need: "01101000 01101001" to become "Hi".

Я ищу наиболее прямой способ реализации этого.Обратите внимание на пробел между каждыми 8 битами двоичных чисел.

Ответы [ 2 ]

2 голосов
/ 27 июня 2011

Учитывая, что формат всегда примерно такой, этот код должен работать:

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];
}

Скажите, была ли какая-то его часть неясной.

1 голос
/ 27 июня 2011

Как это?

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;
}

(Публикация в вики сообщества - мои навыки в old-skool C устарели - не стесняйтесь убирать это.: -))

...