Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.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
Objective c 如何解压缩使用zlib压缩的NSString_Objective C_Zlib_Compression - Fatal编程技术网

Objective c 如何解压缩使用zlib压缩的NSString

Objective c 如何解压缩使用zlib压缩的NSString,objective-c,zlib,compression,Objective C,Zlib,Compression,我有一个NSString(例如enolycgsvgchvilseows1iopqbfzgb4),我从一个web服务器上获得,它只是一个使用zlib压缩的普通字符串。如何在Objective-C中解压?我发现了一些库,但它们只接受完整的文件,而不是简单的字符串。好的,根据上面的内容,您似乎不知道格式是什么,但它似乎是ZLibdeflate,Base64编码的。不知羞耻地抄袭其他StackOverflow答案,这里有一段代码可以解压您的数据: #import <Foundation/Found

我有一个
NSString
(例如
enolycgsvgchvilseows1iopqbfzgb4
),我从一个web服务器上获得,它只是一个使用
zlib
压缩的普通字符串。如何在Objective-C中解压?我发现了一些库,但它们只接受完整的文件,而不是简单的字符串。

好的,根据上面的内容,您似乎不知道格式是什么,但它似乎是ZLib
deflate
,Base64编码的。不知羞耻地抄袭其他StackOverflow答案,这里有一段代码可以解压您的数据:

#import <Foundation/Foundation.h>
#import <zlib.h>

int main( int argc, const char * argv[] )
{
    @autoreleasepool
    {
        NSLog( @"Starting..." );

        NSString      * base64String     = @"eJwLycgsVgChvILSEoWS1IoSPQBFZgb4";
        NSData        * compressedData   = [ [ NSData alloc ] initWithBase64EncodedString: base64String options: 0 ];
        NSUInteger      full_length      = [ compressedData length ];
        NSUInteger      half_length      = [ compressedData length ] / 2;
        NSMutableData * decompressedData = [ NSMutableData dataWithLength: full_length + half_length ];
        BOOL            done             = NO;
        int             status;
        z_stream        strm;

        strm.next_in   = ( Bytef * )[ compressedData bytes  ];
        strm.avail_in  = ( unsigned int ) full_length;
        strm.total_out = 0;
        strm.zalloc    = Z_NULL;
        strm.zfree     = Z_NULL;

        if ( inflateInit2( &strm, ( 15 + 32 ) ) != Z_OK )
        {
            NSLog( @"Could not initialise ZLib" );
            return EXIT_FAILURE;
        }

        while ( done == NO )
        {
            // Make sure we have enough room and reset the lengths.

            if ( strm.total_out >= [ decompressedData length ] )
            {
                [ decompressedData increaseLengthBy: half_length ];
            }

            strm.next_out  = [ decompressedData mutableBytes ] + strm.total_out;
            strm.avail_out = ( unsigned int )( [ decompressedData length ] - strm.total_out );

            // Inflate another chunk.

            status = inflate( &strm, Z_SYNC_FLUSH );

            if ( status == Z_STREAM_END )
            {
                done = YES;
            }
            else if ( status != Z_OK )
            {
                NSLog( @"Decompression failed with status %i", status );
                break;
            }
        }

        if ( inflateEnd( &strm ) != Z_OK )
        {
            NSLog( @"Could not complete decompression" );
            return EXIT_FAILURE;
        }

        // Set real length.

        if ( done )
        {
            [ decompressedData setLength: strm.total_out ];

            NSString * string = [ [ NSString alloc ] initWithData: decompressedData
                                                         encoding: NSUTF8StringEncoding ];

            NSLog( @"String: %@", string );
        }
        else
        {
            return EXIT_FAILURE;
        }
    }

    NSLog( @"...Success" );

    return EXIT_SUCCESS;
}

你需要确保你链接到ZLib。从XCode中项目的构建阶段部分,在“链接二进制文件与库”下,“+”按钮提供一个可搜索的弹出窗口;寻找“libz”。这可能在iOS上不存在;它存在于OSXSDK中;这超出了这个答案的范围,毫无疑问,如果您遇到问题,谷歌会迅速给出答案。

好的,基于上述内容,您似乎不知道该格式是什么,但它似乎是ZLib
deflate
,Base64编码的。不知羞耻地抄袭其他StackOverflow答案,这里有一段代码可以解压您的数据:

#import <Foundation/Foundation.h>
#import <zlib.h>

int main( int argc, const char * argv[] )
{
    @autoreleasepool
    {
        NSLog( @"Starting..." );

        NSString      * base64String     = @"eJwLycgsVgChvILSEoWS1IoSPQBFZgb4";
        NSData        * compressedData   = [ [ NSData alloc ] initWithBase64EncodedString: base64String options: 0 ];
        NSUInteger      full_length      = [ compressedData length ];
        NSUInteger      half_length      = [ compressedData length ] / 2;
        NSMutableData * decompressedData = [ NSMutableData dataWithLength: full_length + half_length ];
        BOOL            done             = NO;
        int             status;
        z_stream        strm;

        strm.next_in   = ( Bytef * )[ compressedData bytes  ];
        strm.avail_in  = ( unsigned int ) full_length;
        strm.total_out = 0;
        strm.zalloc    = Z_NULL;
        strm.zfree     = Z_NULL;

        if ( inflateInit2( &strm, ( 15 + 32 ) ) != Z_OK )
        {
            NSLog( @"Could not initialise ZLib" );
            return EXIT_FAILURE;
        }

        while ( done == NO )
        {
            // Make sure we have enough room and reset the lengths.

            if ( strm.total_out >= [ decompressedData length ] )
            {
                [ decompressedData increaseLengthBy: half_length ];
            }

            strm.next_out  = [ decompressedData mutableBytes ] + strm.total_out;
            strm.avail_out = ( unsigned int )( [ decompressedData length ] - strm.total_out );

            // Inflate another chunk.

            status = inflate( &strm, Z_SYNC_FLUSH );

            if ( status == Z_STREAM_END )
            {
                done = YES;
            }
            else if ( status != Z_OK )
            {
                NSLog( @"Decompression failed with status %i", status );
                break;
            }
        }

        if ( inflateEnd( &strm ) != Z_OK )
        {
            NSLog( @"Could not complete decompression" );
            return EXIT_FAILURE;
        }

        // Set real length.

        if ( done )
        {
            [ decompressedData setLength: strm.total_out ];

            NSString * string = [ [ NSString alloc ] initWithData: decompressedData
                                                         encoding: NSUTF8StringEncoding ];

            NSLog( @"String: %@", string );
        }
        else
        {
            return EXIT_FAILURE;
        }
    }

    NSLog( @"...Success" );

    return EXIT_SUCCESS;
}

你需要确保你链接到ZLib。从XCode中项目的构建阶段部分,在“链接二进制文件与库”下,“+”按钮提供一个可搜索的弹出窗口;寻找“libz”。这可能在iOS上不存在;它存在于OSXSDK中;这超出了这个答案的范围,如果您遇到问题,谷歌无疑会迅速给出答案。

您所说的“压缩”是什么意思?所讨论的字符串不是二进制压缩的,因为它使用ASCII字符,但它看起来也不像Base64。您给出的示例使用了什么样的GLib方法以及原始输入字符串是什么?@Andrewodgkinson这里有一个示例网站展示了这一点:您可以输入文本来缩小或扩大现有文本。这个网站正确地解压了我从服务器API收到的文本,所以我想我只是好奇我会怎么做locally@AndrewHodgkinson类似地,这个站点将对deflate执行相同的操作。示例数据是用Base64编码的zlib(而不是“glib”)流。它解压缩为
,这是输入文本。
。对于阅读本文并对“glib”参考文献感到困惑的人,原始问题错误地键入了“zlib”,而改为“glib”。看起来O.P.从那以后更新了他们的问题并修复了它,这使得上面的几条评论令人困惑,但同时也使它对长期档案和谷歌结果更有价值。荣誉!:)你说的“压缩”是什么意思?所讨论的字符串不是二进制压缩的,因为它使用ASCII字符,但它看起来也不像Base64。您给出的示例使用了什么样的GLib方法以及原始输入字符串是什么?@Andrewodgkinson这里有一个示例网站展示了这一点:您可以输入文本来缩小或扩大现有文本。这个网站正确地解压了我从服务器API收到的文本,所以我想我只是好奇我会怎么做locally@AndrewHodgkinson类似地,这个站点将对deflate执行相同的操作。示例数据是用Base64编码的zlib(而不是“glib”)流。它解压缩为
,这是输入文本。
。对于阅读本文并对“glib”参考文献感到困惑的人,原始问题错误地键入了“zlib”,而改为“glib”。看起来O.P.从那以后更新了他们的问题并修复了它,这使得上面的几条评论令人困惑,但同时也使它对长期档案和谷歌结果更有价值。荣誉!:)