(iphone) кодировка base64 - PullRequest
       43

(iphone) кодировка base64

0 голосов
/ 23 мая 2011

Я где-то получаю KERN_PROTECTION_FAILURE (трассировка стека показывает, что это происходит в главном цикле, но не дает мне больше подробностей, потому что кажется, что память была повреждена в предыдущем цикле. У меня есть все настройки, чтобы правильно увидеть отладочный вывод)

Когда я удаляю вызов следующего кода, симптом исчезает.
( Подтвердите квитанцию ​​для покупки в приложении e)

- (NSString *)encode:(const uint8_t *)input length:(NSInteger)length {
    static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

    NSMutableData *data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
    uint8_t *output = (uint8_t *)data.mutableBytes;

    for (NSInteger i = 0; i < length; i += 3) {
        NSInteger value = 0;
        for (NSInteger j = i; j < (i + 3); j++) {
                value <<= 8;

                if (j < length) {
                        value |= (0xFF & input[j]);
                }
        }

        NSInteger index = (i / 3) * 4;
        output[index + 0] =                    table[(value >> 18) & 0x3F];
        output[index + 1] =                    table[(value >> 12) & 0x3F];
        output[index + 2] = (i + 1) < length ? table[(value >> 6)  & 0x3F] : '=';
        output[index + 3] = (i + 2) < length ? table[(value >> 0)  & 0x3F] : '=';
    }

    return [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease];
}

Я вижу, что есть другие способы получениякодировка base64, Как мне выполнить кодирование base64 на iphone-sdk?
Что я нахожу странным, так это то, что длина вычисляется по-разному.
((длина +2 / 3) * 4выше и lentext * 4/3 + 4. ниже.
Может кто-нибудь сказать, что происходит?
Кроме того, используя приведенный ниже код, я получаю сообщение об ошибке с данными о получении, когда передаю закодированные данные в appleсервер.

+ (NSString *) base64StringFromData: (NSData *)data length: (int)length {
int lentext = [data length]; 
if (lentext < 1) return @"";

char *outbuf = malloc(lentext*4/3+4); // add 4 to be sure

if ( !outbuf ) return nil;

const unsigned char *raw = [data bytes];

int inp = 0;
int outp = 0;
int do_now = lentext - (lentext%3);

for ( outp = 0, inp = 0; inp < do_now; inp += 3 )
{
    outbuf[outp++] = base64EncodingTable[(raw[inp] & 0xFC) >> 2];
    outbuf[outp++] = base64EncodingTable[((raw[inp] & 0x03) << 4) | ((raw[inp+1] & 0xF0) >> 4)];
    outbuf[outp++] = base64EncodingTable[((raw[inp+1] & 0x0F) << 2) | ((raw[inp+2] & 0xC0) >> 6)];
    outbuf[outp++] = base64EncodingTable[raw[inp+2] & 0x3F];
}

if ( do_now < lentext )
{
    char tmpbuf[2] = {0,0};
    int left = lentext%3;
    for ( int i=0; i < left; i++ )
    {
        tmpbuf[i] = raw[do_now+i];
    }
    raw = tmpbuf;
    outbuf[outp++] = base64EncodingTable[(raw[inp] & 0xFC) >> 2];
    outbuf[outp++] = base64EncodingTable[((raw[inp] & 0x03) << 4) | ((raw[inp+1] & 0xF0) >> 4)];
    if ( left == 2 ) outbuf[outp++] = base64EncodingTable[((raw[inp+1] & 0x0F) << 2) | ((raw[inp+2] & 0xC0) >> 6)];
}

NSString *ret = [[[NSString alloc] initWithBytes:outbuf length:outp encoding:NSASCIIStringEncoding] autorelease];
free(outbuf);

return ret;
}

1 Ответ

0 голосов
/ 23 мая 2011

Я использую эту очень маленькую библиотеку для кодирования / декодирования Base64: http://imthi.com/blog/programming/iphone-sdk-base64-encode-decode.php

Он работает, и я предполагаю, что вы используете аналогичную версию. Вы пытались позвонить +initialize перед первым использованием?

...