从python读取BerkleyDB文件:`\ x01 \ x0b \ x88 \ x0c \ x01`?

时间:2011-04-10 07:26:10

标签: python encoding character-encoding

这个问题简而言之:\x04++HLMh7EjP3ILSfF\x00

是什么
'\x01\x0b\x88\x0c\x01-\x10\x02\x06!\x05"\x05#\n$\x0c\'\x0e%\x0b\x01&\x02\'\x06(\n\x00\x00'

意味着吗

大家好,

我正在尝试阅读palm pre 2数据库文件。有些信息可供in the documentation,但还不足以让我清楚地了解格式。

使用file命令,我了解到格式为objects.db: Berkeley DB (Btree, version 9, native byte-order)

尝试使用bsddb.open()直接打开数据库不起作用;我不得不使用

>>> env = bsddb.db.DBEnv()
>>> env.open(None, bsddb.db.DB_CREATE | bsddb.db.DB_INIT_MPOOL)
>>> internal_db = bsddb.db.DB(env)
>>> internal_db.open('C:\objects.db', 'objects.db', bsddb.db.DB_BTREE, bsddb.db.DB_RDONLY)

现在我打开了数据库,但是键和值是以我不理解的格式编码的:例如,这里有一些键:'\x04++HMvu4v2GZbo1Ox\x00', '\x04++HMwBSPR8Zvwkt5\x00', '\x04++HMwF4OJ0R+WeSS\x00'和一个值:

'\x01\x0b\xb7\r\x00\x05\xee\x89\x10\x029\x060\x04\x00/\x03\x04++HQqD0wWr_hZP75\x00\x00 \x02"\x06\x00$\x04inbox\x001\x02+\x04+33626320868\x00\x00%\x0e\x00\x00\x01.0\x19\xb3\x10&\x04Ok\x00-\rM\\/\x892\n:\r\x00\x05\xee\x89\'\x04sms\x003\n(\x04successful\x00.\rM\\/\x89\x00'

我试图从utf8解码它,但我没有得到任何令人信服的结果。你知道正在使用哪种编码吗?我不理解native byte-order命令输出的file部分,是否与此相关?

谢谢!

2 个答案:

答案 0 :(得分:1)

受过教育的猜测

从简单的检查来看,该消息可能是“短信成功”,电话号码为:

  
    
      

unicode(s,errors ='ignore')       u'\ x01 \ x0b \ r \ x00 \ x05 \ x10 \ x029 \ x060 \ x04 \ x00 / \ x03 \ x04 ++ HQqD0wWr_hZP75 \ x00 \ x00 \ x02“\ x06 \ x00 $ \ x04inbox \ x001 \ x02 + \ x04 33626320868 \ X00 \ X00%\ x0e \ X00 \ X00 \ x01.0 \ X19 \ X10&安培; \ x04Ok \ x00- \ RM \ / 2 \ N:\ r \ X00 \ X05 \'\ x04sms \ X003 \ N( \ x04successful \ X00。\ RM \ / \ X00'

    
  

我认为其他字符是二进制数据。

编码

解码它没有帮助 - chardet和BeautifulSoup都将其检测为windows-1252

>>> s=u'\x01\x0b\xb7\r\x00\x05\xee\u2030\x10\x029\x060\x04\x00/\x03\x04++HQqD0wWr_hZP75\x00\x00 \x02"\x06\x00$\x04inbox\x001\x02+\x04+33626320868\x00\x00%\x0e\x00\x00\x01.0\x19\xb3\x10&\x04Ok\x00-\rM\\/\u20302\n:\r\x00\x05\xee\u2030\'\x04sms\x003\n(\x04successful\x00.\rM\\/\u2030\x00'
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup(s)
>>> soup.originalEncoding
'windows-1252'
>>> chardet.detect(s)
{'confidence': 0.5, 'encoding': 'windows-1252'}

然而,1252解码没有任何意义:

>>> s.decode('windows-1252')
u'\x01\x0b\xb7\r\x00\x05\xee\u2030\x10\x029\x060\x04\x00/\x03\x04++HQqD0wWr_hZP75\x00\x00 \x02"\x06\x00$\x04inbox\x001\x02+\x04+33626320868\x00\x00%\x0e\x00\x00\x01.0\x19\xb3\x10&\x04Ok\x00-\rM\\/\u20302\n:\r\x00\x05\xee\u2030\'\x04sms\x003\n(\x04successful\x00.\rM\\/\u2030\x00'

答案 1 :(得分:0)

尝试使用PalmDBdbsql代替bsddb