данные longblob от коннектора mysql C до NSData

0

Я пытаюсь выбрать нечетный файл, который работает очень хорошо в php с помощью C-коннектора: выбор делает: выберите media_ogg из префикса tablemedia 1;

код для получения результата:

           row = mysql_fetch_row(qResult);
           unsigned long *lengths;
           lengths = mysql_fetch_lengths(qResult);
            NSLog(@"%@",[NSNumber numberWithUnsignedInteger:lengths[i]]);

            NSData *data = [NSData dataWithBytes:row[i] length:lengths[i]];*/
            NSString *url = [NSString stringWithFormat:@"/Users/alex/test.ogg"];
            FILE *fp;
            fp = fopen([url UTF8String], "wb");
            fwrite(row[0], lengths[0], 1, fp);
            fclose(fp);
            mysql_free_result(qResult);

Файл записывается, но не воспроизводится. Похоже, я не понимаю правила инкапсуляции из MYSQL_ROW в байты. Наверное, кто-то может предложить?

Теги:
cocoa

1 ответ

0

Слишком сложно понять, но данные были декодированы в base64. Кодировка u может видеть ниже. Протестировано.

            NSString *base64 = [NSString stringWithCString:row[0] encoding:NSASCIIStringEncoding];
            NSData *base64Data = [base64 dataUsingEncoding:NSASCIIStringEncoding];
            const unsigned char *base64Bytes = [base64Data bytes];
            NSMutableData *mutableData = [NSMutableData dataWithCapacity:[base64Data length]];
            NSUInteger lentext = [base64Data length];
            unsigned long ixtext = 0;
            unsigned char ch = 0;
            //const unsigned char *base64Bytes = nil;
            short i = 0, ixinbuf = 0;
            BOOL flignore = NO;
            BOOL flendtext = NO;
            unsigned char inbuf[4], outbuf[3];


            while( YES ) {
                if( ixtext >= lentext ) break;
                ch = base64Bytes[ixtext++];
                flignore = NO;

                if( ( ch >= 'A' ) && ( ch <= 'Z' ) ) ch = ch - 'A';
                else if( ( ch >= 'a' ) && ( ch <= 'z' ) ) ch = ch - 'a' + 26;
                else if( ( ch >= '0' ) && ( ch <= '9' ) ) ch = ch - '0' + 52;
                else if( ch == '+' ) ch = 62;
                else if( ch == '=' ) flendtext = YES;
                else if( ch == '/' ) ch = 63;
                else flignore = YES;

                if( ! flignore ) {
                    short ctcharsinbuf = 3;
                    BOOL flbreak = NO;

                    if( flendtext ) {
                        if( ! ixinbuf ) break;
                        if( ( ixinbuf == 1 ) || ( ixinbuf == 2 ) ) ctcharsinbuf = 1;
                        else ctcharsinbuf = 2;
                        ixinbuf = 3;
                        flbreak = YES;
                    }

                    inbuf [ixinbuf++] = ch;

                    if( ixinbuf == 4 ) {
                        ixinbuf = 0;
                        outbuf [0] = ( inbuf[0] << 2 ) | ( ( inbuf[1] & 0x30) >> 4 );
                        outbuf [1] = ( ( inbuf[1] & 0x0F ) << 4 ) | ( ( inbuf[2] & 0x3C ) >> 2 );
                        outbuf [2] = ( ( inbuf[2] & 0x03 ) << 6 ) | ( inbuf[3] & 0x3F );

                        for( i = 0; i < ctcharsinbuf; i++ )
                            [mutableData appendBytes:&outbuf[i] length:1];
                    }

                    if( flbreak )  break;
                }
            }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню