10935


C#側でtarからZipをMemoryStreamに取り出すことができたので、  
これをiOS側に渡してC++かobejective-cでunzipして、  
unzipしたものをbyte配列もしくはStreamで持ちたいのですが、  
C++かobejective-cでZipのByte配列をUnZipしてByte配列に変換する方法、  
もしくはライブラリはないでしょうか？

まだObejective-c側しか調査してないのですが、  
SSZipArchiveやObjectiveZipというものを見つけたのですが  
ファイル名を与えないと解凍できないようでして、  
C#のZipInputStreamのようなものがなく悩んでおります。

●SSZipArchive  
<https://github.com/soffes/ssziparchive>  
●ObjectiveZip  
<https://github.com/gianlucabertani/Objective-Zip>

■追記(Zlib 使用)

[code]

    #import <Foundation/Foundation.h>
    #include <zlib.h>
    
    
    extern "C"{
        void uncompressByGzip(const char** ptrSrc, const int srcLength);
    }
    
    
    void uncompressByGzip(const char** ptrSrc, const int srcLength)
    {
        NSData *source = [NSData dataWithBytes:(const void *)ptrSrc length:(sizeof(unsigned char) * srcLength)];
    
        NSString* str = [NSString stringWithFormat:@"%d",srcLength];
        NSLog(@"src = %@",str);
        if (source.length == 0)
            return;
        NSLog(@"11111");
    
        z_stream stream;
        stream.zalloc = Z_NULL;
        stream.zfree = Z_NULL;
        stream.opaque = Z_NULL;
        stream.avail_in = (uInt)source.length;
        stream.next_in = (Bytef *)source.bytes;
        stream.total_out = 0;
        stream.avail_out = 0;
    
        NSLog(@"22222");
        if (inflateInit2(&stream, 31) != Z_OK)
            return;
    
        NSLog(@"33333");
        NSMutableData *FileSystemData = [NSMutableData dataWithCapacity:0];
        while (stream.avail_out == 0) {
            NSLog(@"12345");
            Bytef buffer[16384];
            stream.next_out = buffer;
            stream.avail_out = sizeof(buffer);
            NSString* avail_outbef = [NSString stringWithFormat:@"%d",(NSInteger)stream.avail_out];
            NSLog(@"avail_outbef = %@",avail_outbef);
    
    //        inflate(&stream, Z_FINISH);
            inflate(&stream,Z_NO_FLUSH);
            size_t length = sizeof(buffer) - stream.avail_out;
    
            avail_outbef = [NSString stringWithFormat:@"%d",(NSInteger)stream.avail_out];
            NSLog(@"avail_outaft = %@",avail_outbef);
    
            NSString* strlength = [NSString stringWithFormat:@"%d",(NSInteger)length];
            NSLog(@"length = %@",strlength);
    
            if (length > 0)
                [FileSystemData appendBytes:buffer length:length];
        }
        inflateEnd(&stream);
        NSLog(@"44444");
    }
    
[/code]


CC BY-SA 3.0
2015-06-01T12:41:24.187
10848
2015-06-03T06:23:46.557
2015-06-02T11:43:16.463
5261
5261
question
objective-c c# c++
C++かObjective-cでByte配列からByte配列にZip解凍したい


c のライブラリですが zlib はどうでしょうか？  
`inflate` 関数を使用すれば Stream で行うことができます。

xcode のプロジェクトには `Linked Frameworks And Libraries` から `libz` (ややこしい）で追加できます。

公式のサンプルは <http://www.zlib.net/zlib_how.html>  
また日本語での解説は以下がわかりやすいと思います。 <http://s-yata.jp/docs/zlib/>


CC BY-SA 3.0
2015-06-02T02:29:43.390
10864
2015-06-02T02:29:43.390
5106
10848
answer


SSZipArchiveもObjectiveZipも[Minizip](http://www.winimage.com/zLibDll/minizip.html)のラッパーなので、Minizipをそのまま使ったほうがいいと思います。  
MiniZipを直接使えばファイルを介さずにメモリから読み書きできます。


CC BY-SA 3.0
2015-06-03T06:23:46.557
10935
2015-06-03T06:23:46.557
3639
10848
answer