2

Cで書かれた効率的な(テキストファイル> 5MBの)引用された印刷可能なデコーダーはありますか?iOS プロジェクトでこのようなデコーダーが必要です。

その間、私は遅すぎる高レベルのデコーダーを使用しています。5 MB のファイルをデコードするには、デバイスで最大 10 分かかります。

- (NSString *)decodedQuotedPrintable:(NSString *)string
{
    NSMutableString *decodedString = string.mutableCopy;

    [decodedString replaceOccurrencesOfString:@"=\r\n" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, decodedString.length)];

    NSInteger idx = 0;
    _WHILE(idx != NSNotFound)
    {
        idx = [decodedString rangeOfString:@"="
                                   options:NSCaseInsensitiveSearch
                                     range:NSMakeRange(idx + 1, decodedString.length - idx - 1)].location;

        _IF(idx + 5> decodedString.length)
        {
            break;
        }
        unsigned int hex = 0;
        NSScanner *scanner = [NSScanner scannerWithString:[decodedString substringWithRange:
                                                           NSMakeRange(idx+1, 2)]];

        [scanner scanHexInt:&hex];

        [decodedString replaceCharactersInRange:NSMakeRange(idx, 3)
                                     withString:[NSString stringWithFormat:@"%c", hex]];

    }

    return decodedString;
}
4

2 に答える 2

2

Cレベルの文字列操作を使用して取得しました。それは魅力のように機能します。これにより、iPad2 でのテスト ファイルの処理時間が 6 分から 3 秒に短縮されました。

- (char *)replace1:(char const * const)original
{
    char const * const pattern = "=\r\n";

    size_t const patlen = strlen(pattern);
    size_t const orilen = strlen(original);

    size_t patcnt = 0;
    const char * oriptr;
    const char * patloc;

    // find how many times the pattern occurs in the original string
    _FOR(oriptr = original;
         (patloc = strstr(oriptr, pattern));
         oriptr = patloc + patlen)
    {
        patcnt++;
    }

    {
        // allocate memory for the new string
        size_t const retlen = orilen - patcnt * patlen;
        char * const returned = (char *) malloc( sizeof(char) * (retlen + 1) );

        _IF(returned != NULL)
        {
            // copy the original string,
            // replacing all the instances of the pattern
            char * retptr = returned;
            _FOR(oriptr = original;
                 (patloc = strstr(oriptr, pattern));
                 oriptr = patloc + patlen)
            {
                size_t const skplen = patloc - oriptr;
                // copy the section until the occurence of the pattern
                strncpy(retptr, oriptr, skplen);
                retptr += skplen;
            }
            // copy the rest of the string.
            strcpy(retptr, oriptr);
        }
        return returned;
    }
}

- (char *)replace2:(char const * const)original
{
    size_t const replen = 1;
    size_t const patlen = 3;
    size_t const orilen = strlen(original);

    size_t patcnt = 0;
    const char * oriptr;
    const char * patloc;

    // find how many times the pattern occurs in the original string
    _FOR(oriptr = original; (patloc = strstr(oriptr, "=")); oriptr = patloc + patlen)
    {
        patcnt++;
    }

    {
        // allocate memory for the new string
        size_t const retlen = orilen + patcnt * (replen - patlen);
        char * const returned = (char *) malloc( sizeof(char) * (retlen + 1) );

        _IF(returned != NULL)
        {
            // copy the original string,
            // replacing all the instances of the pattern
            char * retptr = returned;
            _FOR(oriptr = original;
                 (patloc = strstr(oriptr, "="));
                 oriptr = patloc + patlen)
            {
                char newRep[3];

                newRep[0] = patloc[1];
                newRep[1] = patloc[2];
                newRep[2] = '\0';

                char _rep[2];
                _rep[0] = (char)(int)strtol(newRep, NULL, 16);
                _rep[1] = '\0';

                size_t const skplen = patloc - oriptr;
                // copy the section until the occurence of the pattern
                strncpy(retptr, oriptr, skplen);
                retptr += skplen;
                // copy the replacement
                strncpy(retptr, _rep, replen);
                retptr += replen;
            }
            // copy the rest of the string.
            strcpy(retptr, oriptr);
        }
        return returned;
    }
}

- (NSString *)decodedQuotedPrintable:(NSString *)string
{
    char *temp = [self replace1:(char *)[string UTF8String]];

    temp = [self replace2:temp];

    return [NSString stringWithCString:temp
                              encoding:NSUTF8StringEncoding];
}
于 2013-06-26T11:35:43.543 に答える
1

変更可能な文字列内でこの操作をすべて実行しないようにしてください (一度に 1 文字ずつ、文字列が病的に短縮されてしまいます)。

新しい文字列 (またはバッファー) を使用し、元の文字列を解析して、新しい文字列に書き込みます。

于 2013-06-25T14:26:01.157 に答える