我有一个预先存在的伯克利数据库,它是用C++编写的程序,并从中读取。我需要避开这个程序,直接用python写数据库。你知道吗
<>我可以做到这一点,但我有一段时间试图正确地编码我的数据,使其处于正确的形式,然后可以由原来的C++程序读取。事实上,当我知道值是什么的时候,我不知道如何解码现有的数据。你知道吗数据库中键-值对的键应该是YYYYMMDDHHmmSS格式的时间戳。这些值应该是五个加倍和一个int的混合在一起,我的意思是(从C++程序的源代码),下面的结构(?)DVALS公司
typedef struct
{
double d1;
double d2;
double d3;
double d4;
double d5;
int i1;
} DVALS;
作为键值对的值写入数据库,如下所示:
DBT data;
memset(&data, 0, sizeof(DBT));
DVALS dval;
memset(&dval, 0, sizeof(DVALS));
data.data = &dval;
data.size = sizeof(DVALS);
db->put(db, NULL, &key, &data, 0);
幸运的是,我知道这些值是什么。如果我从命令行运行
db_dump myfile
最终记录是:
323031393033313431353533303000
ae47e17a140e4040ae47e17a140e4040ae47e17a140e4040ae47e17a140e40400000000000b6a4400000000000000000
使用python的bsddb3模块,我还可以拉出这个记录:
from bsddb3 import db
myDB = db.DB()
myDB.open('myfile', None, db.DB_BTREE)
cur = myDB.cursor()
kvpair = cur.last()
kvpair现在保存以下信息:
(b'20190314155300\x00', b'\xaeG\xe1z\x14\x0e@@\xaeG\xe1z\x14\x0e@@\xaeG\xe1z\x14\x0e@@\xaeG\xe1z\x14\x0e@@\x00\x00\x00\x00\x00\xb6\xa4@\x00\x00\x00\x00\x00\x00\x00\x00')
时间戳易于读取,在这种情况下,实际值如下所示:
d1 = d2 = d3 = d4 = 32.11
d5 = 2651
i1 = 0
由于“\xaeG\xe1z\x14\x0e@@@”序列重复了4次,我认为它对应于值32.11
因此,我认为我的问题可能只是关于编码/解码,但也许还有更多的问题,这就是背景故事。你知道吗
kvpair[1].decode('utf-8')
使用各种编码只会产生类似以下错误:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xae in position 0: invalid start byte
值数据是二进制的,因此可以使用Python的struct模块将其解包。你知道吗
^{} 接受两个参数:一个format specifier,它定义数据格式和类型以及要解包的数据。格式
'<5di4x'
描述:<
:小端序5d
:五个双字节(每个8字节)i
:一个有符号int(4字节;I
表示无符号)4x
:四个pad字节可以使用^{} 以相同的方式打包数据。你知道吗
相关问题 更多 >
编程相关推荐