我正在处理包含非 ASCII 字符的 gzip 原始数据,我无法解压缩和解码。
我通过 python 客户端从 Firestore 获取数据,有效负载如下所示:
{'lastSchemaUpdateReason': 'new-app',
'lastSchemaUpdateAt': DatetimeWithNanoseconds(2023, 10, 3, 18, 2, 38, 6000, tzinfo=datetime.timezone.utc),
'schema': '\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03íZÝRë6\x10~\x15\x8f§\x971´\x07\x0eC¹é\x00iJ\x18\x08\x84\x7fÎ)\x17\x8aµN\x14lÉHr\x02\x9cá%:½ï+ö\x11*É6q°\x9dÄ9\x81¦\x9dpc"iW»\x9f>íz%\x7f³%êø ì\x9d¯ßl\x8a\x02°wÒ§zH2\x00Ç\x0cp\x1e#|Iàúàrs£±ýélk»ÿHì\x9aMÄy\x08.A¾½ã!_ÀKÍv\x99\x1f\x054«Ñþ\x81³a\x93bxT\x12ò)4\x93Ü\x13\x8aU\x97\x90\x9cЮ\xadäz\x04c\xa0ö\x8eä\x11hŧ\x9cIp%àDµn»\x14ÀÍ\x84\x1eq3Íg\x80ð\tõ\x9fRa\x8f³\xa0e¬¿ÐÆÇÍ/µq{êÊ\x18LD裧VÜü÷_\x7fþa\x9d±¡eúf6´Ä¨¼ý¥f¥\x1a\x93qãV5\x03Ô\x85¼=D7;\x11\'Ú¤D¢Áx\x10ù(3ª\x0bÒ\x19 NÌ|µÔÿG-SdaÒß\x82¡µo\x96Ñ.up\x1aÆ\x8dáq°\x99\x83x\x1fq<Å\x977`TÀw\x1e\x14¦R\x85\x88\x06\x1a0NôD¹¥\x11Ökç/y·:\x8cù\x80h\x0cö¸\x17å$\x9ffPï\x84}¹ÊYrÚc´\x80$¡nvh\x14t\x80/\x1f¶{äv s®ìbÌA\x88Yvà¿ìÆ\x1bj³ Dôi\x92Ý\x13¶\\\x1d\x84ËI(\tÓ{®pÊy¬Ï\xa0Ý>¼ºA\x85\x1bÒ:<?i½\x0fÞ^ÎÔÐ\x8fº\x84:®B+\x92(ñ7nTaw4ÎeTHD5?\x06È\x8f´\xad]\x9f`p\x90\x89\x12\x19ùibqt\x91Ì\x91ð(µl\x88¸r^\x02\x17ZÐt\x8fiH\x02_"ÿÚ\x81ÁC\x91/\x1dW>\x8e0\x8eÃ\x9cÂÙV\x1a{\x0cgÆ\x83Úw\x193\x98Ë\x9dû\x81\x19ªø\xad\x14µ\x92t[nyjp<þ¢lyFÝMµ\x04jU\x04\x8c"LL£4=gøÐß8iý\x98ãÃI$\x15®ÿ_2衾Z{\'T[,,¢\x83\x12á\x91«u\tµÑv\x9by\x10FÚ\x94ëÖ\x13\x8b¸Õ\x01!\xad~\x84»\x01PiIfa\xad0 \x14,Ù\x03Ëc¾Ï\x86JÖò\x08øXXz\x83\x9b\x1e½Ä5\x0bQl1\x83|ñp$Ì\x1eÝù\x9dêeªY\x17Dúê\x91\x84\x9c\x9aeÂ\x7fÍú5@įYi\x045¤\x14â{è\x1d\x07\x8d\x97*¤\x8dǽ\x1bmo\x0e7O÷s´mGÀ\x9fÖÍ\x8f\x1cuû\x82Ñ%"njN\x05ÒJ\x8e¨ÐF8©ð8gMë¼K\x1cÇ\x01½Â\x0f\x1aÄIt7øV\n`©á\x80\x0f\x13Ë\x0bIÑÏuV¡Ä\x10wÚ½\x12J\x98\x9d²âÄûq"\x06xùH±[\x7fh\x88\x12R\x94¼-¯H±(RÄ\x00/\x1f)üú\x1eÿTB\n\x93<W¤x?RÄ\x00/\x1f)Ðþç\x95\x90¢´¨[ÑbQ´H!^>bÜüüÛ\x97~\t1JO)VÄX\x141^Ë\x98¥#Fÿh«×É\x11ã\x1a\x91\x0f+\x9cuÙèHPµ,\x92æM&ýw":=)C±³¾®Ð!hM\x02e|M\x11cý\x19Ü«û\x00\x06ÏnsWýí¯«\x12\x19\tp\x86Ê£µ.ñb¤Ô\x04.èúV\x9fíß½¼ÜÕlÑ\x03HVÅ>w\x11U\x15)\x95È\x95z_\x983öä\x149sä\x0e:\x0b\x9c\x0c©"SÚùUkRU´\x0bÇ \x11FÒx\x1aãhÇ\x8b`Éäh\x8bh׶¤G/¥?¬\x0f®¶ÏÈ}ïó\xa0¥ßÿÍ\x98\x94#ßw\x89¡ëóó\x1eâ\x80ë<Ã\x81ñË\x86¤-wq¢ \x8da\x1aS\x1d\x9f\x1a\x16^\x8f`æFZ¢Ú½Ã[\x9ed\x08*Y¨(Ué$2#\rÅoB3JG\x8aÕ´°\x10\x9fQ\x81"\x00\\\x90"\x05ºÇ\x91ºk\x9a\x8ed\t*ÚpW°\x98c\x04zhË=ïz£¹ñÜiß\x1eâÍÎ\x06k¬nÁ\x16t\x0b6ϱyrâ3ßÍZÉ\x1b¿¡¿\x83F\x87h\x0b¾]K§\xadz±6Ñ\x17UqIö±·\x84é\x94s^\x10.ÏÍÚD`ÏXÑùÑ\x88\x9c\x0b\x065\x99®\x12¦o\x12±\x96¬\x98\x80\x13NÞ\x15ä·\x8a©y{w³ã=oÉãû\x8b\x83ÍÛíFð¼ÁgIͳGÖ\x92Ô<-t×/\x0eàðàæòù§úpO6\x077\xadàó*t/qèþàÛÕü\x94³¦\x87\tó\x9am6w~ú\x8f~ù±úBaÙÜX}\x8b³È7\x867évzÉ[)\x81\x1e_\x89£ö`HQóø6:êz÷\x8d°=K\x02\x9d=¿Q\x00,ÚñéKÆÑÙÊÝ\x92\x02^\x95Nÿ\x00±\x19\x9aeK(\x00\x00',
'tablesUnusedInApp': ['$comments'],
'userID': 'Cs7n7MCVVcLCp6NktfOV',
'dataSize': {'totalRows': 0, 'tables': []},
'numRowsUsedInApp': 8}
“模式”显然是带有前缀
\x1f\x8b\
的 gzip,但正文的其余部分包含非标准字符。有没有办法解码这个?
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03íZÝRë6\x10~\x15\x8f§\x971´\x07\x0eC¹é\x00iJ\x18\x08\x84\x7fÎ)\x17\x8aµN\x14lÉHr\x02\x9cá%:½ï+ö\x11*É6q°\x9dÄ9\x81¦\x9dpc"iW»\x9f>íz%\x7f³%êø ì\x9d¯ßl\x8a\x02°wÒ§zH2\x00Ç\x0cp\x1e#|Iàúàrs£±ýélk»ÿHì\x9aMÄy\x08.A¾½ã!_ÀKÍv\x99\x1f\x054«Ñþ\x81³a\x93bxT\x12ò)4\x93Ü\x13\x8aU\x97\x90\x9cЮ\xadäz\x04c\xa0ö\x8eä\x11hŧ\x9cIp%àDµn»\x14ÀÍ\x84\x1eq3Íg\x80ð\tõ\x9fRa\x8f³\xa0e¬¿ÐÆÇÍ/µq{êÊ\x18LD裧VÜü÷_\x7fþa\x9d±¡eúf6´Ä¨¼ý¥f¥\x1a\x93qãV5\x03Ô\x85¼=D7;\x11\'Ú¤D¢Áx\x10ù(3ª\x0bÒ\x19 NÌ|µÔÿG-SdaÒß\x82¡µo\x96Ñ.up\x1aÆ\x8dáq°\x99\x83x\x1fq<Å\x977`TÀw\x1e\x14¦R\x85\x88\x06\x1a0NôD¹¥\x11Ökç/y·:\x8cù\x80h\x0cö¸\x17å$\x9ffPï\x84}¹ÊYrÚc´\x80$¡nvh\x14t\x80/\x1f¶{äv s®ìbÌA\x88Yvà¿ìÆ\x1bj³ Dôi\x92Ý\x13¶\\\x1d\x84ËI(\tÓ{®pÊy¬Ï\xa0Ý>¼ºA\x85\x1bÒ:<?i½\x0fÞ^ÎÔÐ\x8fº\x84:®B+\x92(ñ7nTaw4ÎeTHD5?\x06È\x8f´\xad]\x9f`p\x90\x89\x12\x19ùibqt\x91Ì\x91ð(µl\x88¸r^\x02\x17ZÐt\x8fiH\x02_"ÿÚ\x81ÁC\x91/\x1dW>\x8e0\x8eÃ\x9cÂÙV\x1a{\x0cgÆ\x83Úw\x193\x98Ë\x9dû\x81\x19ªø\xad\x14µ\x92t[nyjp<þ¢lyFÝMµ\x04jU\x04\x8c"LL£4=gøÐß8iý\x98ãÃI$\x15®ÿ_2衾Z{\'T[,,¢\x83\x12á\x91«u\tµÑv\x9by\x10FÚ\x94ëÖ\x13\x8b¸Õ\x01!\xad~\x84»\x01PiIfa\xad0 \x14,Ù\x03Ëc¾Ï\x86JÖò\x08øXXz\x83\x9b\x1e½Ä5\x0bQl1\x83|ñp$Ì\x1eÝù\x9dêeªY\x17Dúê\x91\x84\x9c\x9aeÂ\x7fÍú5@įYi\x045¤\x14â{è\x1d\x07\x8d\x97*¤\x8dǽ\x1bmo\x0e7O÷s´mGÀ\x9fÖÍ\x8f\x1cuû\x82Ñ%"njN\x05ÒJ\x8e¨ÐF8©ð8gMë¼K\x1cÇ\x01½Â\x0f\x1aÄIt7øV\n`©á\x80\x0f\x13Ë\x0bIÑÏuV¡Ä\x10wÚ½\x12J\x98\x9d²âÄûq"\x06xùH±[\x7fh\x88\x12R\x94¼-¯H±(RÄ\x00/\x1f)üú\x1eÿTB\n\x93<W¤x?RÄ\x00/\x1f)Ðþç\x95\x90¢´¨[ÑbQ´H!^>bÜüüÛ\x97~\t1JO)VÄX\x141^Ë\x98¥#Fÿh«×É\x11ã\x1a\x91\x0f+\x9cuÙèHPµ,\x92æM&ýw":=)C±³¾®Ð!hM\x02e|M\x11cý\x19Ü«û\x00\x06ÏnsWýí¯«\x12\x19\tp\x86Ê£µ.ñb¤Ô\x04.èúV\x9fíß½¼ÜÕlÑ\x03HVÅ>w\x11U\x15)\x95È\x95z_\x983öä\x149sä\x0e:\x0b\x9c\x0c©"SÚùUkRU´\x0bÇ \x11FÒx\x1aãhÇ\x8b`Éäh\x8bh׶¤G/¥?¬\x0f®¶ÏÈ}ïó\xa0¥ßÿÍ\x98\x94#ßw\x89¡ëóó\x1eâ\x80ë<Ã\x81ñË\x86¤-wq¢ \x8da\x1aS\x1d\x9f\x1a\x16^\x8f`æFZ¢Ú½Ã[\x9ed\x08*Y¨(Ué$2#\rÅoB3JG\x8aÕ´°\x10\x9fQ\x81"\x00\\\x90"\x05ºÇ\x91ºk\x9a\x8ed\t*ÚpW°\x98c\x04zhË=ïz£¹ñÜiß\x1eâÍÎ\x06k¬nÁ\x16t\x0b6ϱyrâ3ßÍZÉ\x1b¿¡¿\x83F\x87h\x0b¾]K§\xadz±6Ñ\x17UqIö±·\x84é\x94s^\x10.ÏÍÚD`ÏXÑùÑ\x88\x9c\x0b\x065\x99®\x12¦o\x12±\x96¬\x98\x80\x13NÞ\x15ä·\x8a©y{w³ã=oÉãû\x8b\x83ÍÛíFð¼ÁgIͳGÖ\x92Ô<-t×/\x0eàðàæòù§úpO6\x077\xadàó*t/qèþàÛÕü\x94³¦\x87\tó\x9am6w~ú\x8f~ù±úBaÙÜX}\x8b³È7\x867évzÉ[)\x81\x1e_\x89£ö`HQóø6:êz÷\x8d°=K\x02\x9d=¿Q\x00,ÚñéKÆÑÙÊÝ\x92\x02^\x95Nÿ\x00±\x19\x9aeK(\x00\x00'
我尝试使用 gzip.decompress 解压缩数据并收到错误:
TypeError: a bytes-like object is required, not 'str'
我尝试将字符串读取为字节:
with open(my_string,'rb') as f:
data = f.read()
并收到错误:
ValueError: embedded null byte
似乎“模式”没有正确指定。
当前保存在“schema”中的值看起来就像是刚刚从
print(the gzipped binary data)
的输出中拖拽并粘贴的。
如果“schema”包含二进制 gzip 压缩数据,则效果很好。
$ cat kk.txt
This is dummy data to make dummy gzip bin
$ gzip -k kk.txt
$ ls
kk.txt
kk.txt.gz
import gzip
from pathlib import Path
data_gzipped = Path("kk.txt.gz").read_bytes()
data = {'lastSchemaUpdateReason': 'new-app', 'schema': data_gzipped}
print(data)
print(gzip.decompress(data.get("schema")))
# result
# {'lastSchemaUpdateReason': 'new-app', 'schema': b'\x1f\x8b\x08\x08\xcd\xde\x8df\x00\x03kk.txt\x00\x0b\xc9\xc8,V\x00\xa2\x94\xd2\xdc\xdcJ\x85\x94\xc4\x92D\x85\x92|\x85\xdc\xc4\xecT\xa8PzUf\x81BRf\x1e\x17\x00\xa9\x12\xbd\x9c*\x00\x00\x00'}
# b'This is dummy data to make dummy gzip bin\n'
我建议检查将 gzip 数据分配给 schema 变量的代码。