2012-02-14 2 views
4

압축을 통해 많은 HTML로 sqlite3 db를 최소화하려고합니다. 나는 python을 사용하여 sqlite3 db를 만들고 Android에서 올바르게 압축을 풀려고합니다.sqlite3 데이터베이스에서 gzipped 문자열 읽기 (파이썬 작성, Java Android 읽기)

저는 gzip을 사용하여 HTML을 압축하고 db에 BLOB로 저장합니다. 여기

from sys import stdin, argv 
import sqlite3 
import gzip 
import cStringIO 

def compressBuf(buf): 
    zbuf = cStringIO.StringIO() 
    zfile = gzip.GzipFile(mode = 'wb', fileobj = zbuf, compresslevel = 9) 
    zfile.write(buf) 
    zfile.close() 
    return zbuf.getvalue() 

conn = sqlite3.connect(argv[1]) 
conn.text_factory = str 
c = conn.cursor() 

c.execute('''CREATE TABLE articles (
    id INTEGER NOT NULL PRIMARY KEY, 
    name TEXT, category TEXT, html BLOB);''') 

c.execute(' CREATE INDEX name_index on articles (name); ') 

for line in stdin: 
    line = line.strip().split('\t') 
    line[-1] = sqlite3.Binary(compressBuf(line[-1]))  

    c.execute('INSERT INTO articles VALUES (?, ?, ?, ?);', line) 

conn.commit() 
c.close() 
conn.close() 

안드로이드의 코드 것 :

Cursor cursor = db.rawQuery("SELECT html FROM articles WHERE id = " + id + " limit 1;", null); 
cursor.moveToFirst(); 
byte[] zhtml = cursor.getBlob(0); 
ByteArrayInputStream is = new ByteArrayInputStream(zhtml); 
GZIPInputStream gis = new GZIPInputStream(is, zhtml.length); 

내가 헤더를 불평 다음과 같은 예외를 받고 있어요 잘못되었습니다 : 여기 (파이썬)가 sqlite3를의 DB를 만들기 위해 쓴 코드는

내가 올바른 GZIP 매직 번호 0x1f8b로 반환 compressBuf 기능을 확인할 수 있습니다 파이썬 인터프리터를 사용
java.io.IOException: unknown format (magic number 213c) 
    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:84) 
    at tw.cse.o0o.MyApp.WebServer$ArticleHandler$1.writeTo(WebServer.java:196) 
    at org.apache.http.entity.EntityTemplate.writeTo(EntityTemplate.java:76) 
    at org.apache.http.impl.entity.EntitySerializer.serialize(EntitySerializer.java:97) 
    at org.apache.http.impl.AbstractHttpServerConnection.sendResponseEntity(AbstractHttpServerConnection.java:182) 
    at org.apache.http.protocol.HttpService.handleRequest(HttpService.java:209) 
    at tw.cse.o0o.MyApp.WebServer.run(SQLHelper.java:90) 

:

>>> compressBuf('test') 
'\x1f\x8b\x08\x00 \xba:O\x02\xff+I-.\x01\x00\x0c~\x7f\xd8\x04\x00\x00\x00' 

[편집] 좋아

, 이것은 내가 발견 한 것입니다 :

넥서스 원에

, i를 getBlob 나() 함수는 자동으로 바이너리 데이터를 압축 해제하면 여부는 ZLIB 또는 GZIP . 오류 로그의 213c는 원래 html의 처음 두 문자입니다. 그러나 삼성 갤럭시 탭 (1 세대)에서는 그렇지 않습니다. 나는 아직도 내 갤럭시 탭에서 감압하는 방법을 찾고있다.

답변

0

'\x21\x3c - >>'!<' 또는 아마도 엔디안에 따라 '<!'에 따라 다르다. 나는 당신이 (2 진) gzipped 데이터가 전송 중에 upstuffed되었을 가능성을 조사 할 것을 제안한다.

+0

고마워요! BLOB은 getBlob (0)에 의해 자동으로 압축 해제 된 것 같습니다. 왜 그런지 궁금해. –