2015-01-15 72 views
-1

我有一个精简的实时Linux机箱,与一些硬件接口。试图读取DBM文件

配置文件是* .dbm文件,我无法访问它们。他们似乎是某种键值数据库,但我试过的每个图书馆都是空的。

我试过了从Perl,Python和Ruby运行的DBM阅读库,但没有运气。任何有关这些文件的指导都很棒,我以前从未见过。

这就是当我掏出一个文件时会发生什么。

DBMFILE Aug 31 2004,� 
,jy     � 
�~���"��+�K&��gB��7JJ� 
             ,��GLOBA.PB_COMBI�SMSI��� 
JG] 
,��BUS_DP 
PC � 
      ' 

xLokalT 
      J�� 
       ,��SL_DP 
          PC!� 
            �� 
#,��PLC_PARAMJPf,��PROJEKT�PROFIBUS new network1.00022.02.2012J,��KBL_HEADER:�JJp,��KBLJ��,��ALI-SETUPB ���� 
������������������JJ,,��OBJ-DEFJJ��,��ALI_CLIENTTJJ� 
,��ALI_SERVERJ  J\r�����2, ��  ST_OV_00Boolean0Integer8 0Integer16 
0Integer32 
      0Unsigned8 
0Unsigned32Floating-Point0igned16 
Octet String Jo� ,��DESCRIPT �ABB OyABB Drives RPBA-01ABBSlave1***reserved***� 
                         � 
                         % 

所以要显示什么我已经试过了,只有拿出空对象(不键值)*编辑

的perl -

#!/usr/bin/perl -w                                                        

use strict; 

use DB_File; 
use GDBM_File; 

my ($filename, %hash, $flags, $mode, $DB_HASH) = @ARGV; 

tie %hash, 'DB_File', [$filename, $flags, $mode, $DB_HASH] 
    or die "Cannot open $filename: $!\n"; 

while (my($key, $value) = each %hash) { 
    print "$key = $value\n"; 
} 

# these unties happen automatically at program exit                                                
untie %hash; 

它没有返回

python -

db = dbm.open('file', 'c') 

红宝石 -

db = DBM.open('file', 666, DBM::CREATRW) 

其中每一个返回空。我假设他们使用相同的低级库。 DBM文件的一些历史/上下文会很好,因为似乎有一些不同的版本。

**编辑

在其上运行的文件返回

$ file abb12mb_uncontrolledsynch_ppo2_1slave.dbm 
abb12mb_uncontrolledsynch_ppo2_1slave.dbm: data 

和运行字符串输出

$ strings abb12mb_uncontrolledsynch_ppo2_1slave.dbm 
DBMFILE 
Aug 31 2004 
GLOBAL 
PB_COMBI 
SMSI 
BUS_DP 
Lokal 
SL_DP 
PLC_PARAM 
PROJEKT 
PROFIBUS new network 
1 .000 
22.02.2012 
KBL_HEADER 
ALI-SETUP 
OBJ-DEF 
ALI_CLIENT 
ALI_SERVER 
ST_OV_0 
Boolean 
Integer8 
Integer16 
Integer32 
Unsigned8 
Unsigned16 
Unsigned32 
Floating-Point 
Octet String 
DESCRIPT 
ABB Oy 
ABB Drives RPBA-01 
ABBSlave1 
***reserved*** 
+0

你尝试'文件'串$ filename'的filename' $? – 2015-01-15 15:11:00

+2

答案是使用DBM库,例如Perl的['DB_File'](https://metacpan.org/module/DB_File)。 *“我已经尝试了从perl,python等DBM阅读库,但没有运气。”*请说明你写的内容并描述它如何不适合你。 – Borodin 2015-01-15 15:13:35

+0

Ran'file'和'Strings'没有检索到任何信息或值。更新后显示不同的尝试 – bischoffingston 2015-01-15 16:27:27

回答

0

documentation for Perl's dbmopen function

[此功能已基本取代通过领带功能。]

您可能想试试tieDB_File

use DB_File; 
tie %hash, 'DB_File', $filename, $flags, $mode, $DB_HASH; 

那么你的数据是在%hash

对文件运行file也许会很有意思,看它实际是什么。

+0

谢谢你的头,我试了一下,它打开文件,但没有打印任何东西。我编辑帖子以显示我的代码 – bischoffingston 2015-01-15 15:48:43

+0

'file'说什么? – 2015-01-15 15:49:51

+0

没有用,显示在帖子中。 – bischoffingston 2015-01-15 15:57:44

1

只是为了让我的意见明确,你应该尝试使用默认选项为DB_File,这样

use strict; 
use warnings; 

use DB_File; 

my ($filename) = @ARGV; 

tie my %dbm, 'DB_File', $filename or die qq{Cannot open DBM file "$filename": $!}; 

print "$_\n" for keys %dbm; 
+0

感谢您的澄清。我想,代码对这个结果 '$ perl的dbr.pl abb12mb_uncontrolledsynch_ppo2_1slave.dbm' '无法打开DBM文件 “abb12mb_uncontrolledsynch_ppo2_1slave.dbm”:在dbr.pl线9.' – bischoffingston 2015-01-15 18:31:00