⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file.c

📁 直接存取Access97数据库文件(MDB)的工具库源码
💻 C
字号:
/* MDB Tools - A library for reading MS Access database files * Copyright (C) 2000 Brian Bruns * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */#include "mdbtools.h"static size_t _mdb_read_pg(MdbHandle *mdb, unsigned char *pg_buf, unsigned long pg);MdbHandle *mdb_open(char *filename){MdbHandle *mdb;int key[] = {0x86, 0xfb, 0xec, 0x37, 0x5d, 0x44, 0x9c, 0xfa, 0xc6, 0x5e, 0x28, 0xe6, 0x13, 0xb6};int j,pos;	mdb = mdb_alloc_handle();	mdb->filename = (char *) malloc(strlen(filename)+1);	strcpy(mdb->filename, filename);	mdb->fd = open(filename,O_RDONLY);	if (mdb->fd==-1) {		/* fprintf(stderr,"Couldn't open file %s\n",filename); */		return NULL;	}	if (!mdb_read_pg(mdb, 0)) {		fprintf(stderr,"Couldn't read first page.\n");		return NULL;	}	mdb->jet_version = mdb_get_int32(mdb, 0x14);	if (mdb->jet_version == MDB_VER_JET4) {		mdb->pg_size = 4096;	} else {		mdb->pg_size = 2048;	}	/* get the db encryption key and xor it back to clear text */	mdb->db_key = mdb_get_int32(mdb, 0x3e);	mdb->db_key ^= 0xe15e01b9;	/* get the db password located at 0x42 bytes into the file */	for (pos=0;pos<14;pos++) {		j = mdb_get_int32(mdb,0x42+pos);		j ^= key[pos];		if ( j != 0)			mdb->db_passwd[pos] = j;		else			mdb->db_passwd[pos] = '\0';        }	return mdb;}/* ** mdb_read a wrapper for read that bails if anything is wrong */size_t mdb_read_pg(MdbHandle *mdb, unsigned long pg){size_t len;	len = _mdb_read_pg(mdb, mdb->pg_buf, pg);	/* kan - reset the cur_pos on a new page read */	mdb->cur_pos = 0; /* kan */	return len;}size_t mdb_read_alt_pg(MdbHandle *mdb, unsigned long pg){size_t len;	len = _mdb_read_pg(mdb, mdb->alt_pg_buf, pg);	return len;}static size_t _mdb_read_pg(MdbHandle *mdb, unsigned char *pg_buf, unsigned long pg){size_t len;struct stat status;off_t offset = pg * mdb->pg_size;        fstat(mdb->fd, &status);        if (status.st_size < offset) {                 fprintf(stderr,"offset %lu is beyond EOF\n",offset);                return 0;        }	lseek(mdb->fd, offset, SEEK_SET);	len = read(mdb->fd,pg_buf,mdb->pg_size);	if (len==-1) {		perror("read");		return 0;	}	else if (len<mdb->pg_size) {		/* fprintf(stderr,"EOF reached.\n"); */		return 0;	} 	return len;}unsigned char mdb_get_byte(MdbHandle *mdb, int offset){unsigned char c;	c = mdb->pg_buf[offset];	mdb->cur_pos++;	return c;}int mdb_get_int16(MdbHandle *mdb, int offset){unsigned char *c;int           i;	if (offset < 0 || offset+2 > mdb->pg_size) return -1;	c = &mdb->pg_buf[offset];	i = c[1]*256+c[0];	mdb->cur_pos+=2;	return i;	}long mdb_get_int32(MdbHandle *mdb, int offset){long l;unsigned char *c;	if (offset <0 || offset+4 > mdb->pg_size) return -1;	c = &mdb->pg_buf[offset];	l =c[3]; l<<=8;	l+=c[2]; l<<=8;	l+=c[1]; l<<=8;	l+=c[0];	mdb->cur_pos+=4;	return l;}float mdb_get_single(MdbHandle *mdb, int offset){float f, f2;unsigned char *c;int i;       if (offset <0 || offset+4 > mdb->pg_size) return -1;       memcpy(&f, &mdb->pg_buf[offset], 4);#ifdef HW_BIG_ENDIAN       f2 = f;       for (i=0; i<sizeof(f); i++) {               *(((unsigned char *)&f)+i) =               *(((unsigned char *)&f2)+sizeof(f)-1-i);       }#endif       mdb->cur_pos+=4;       return f;}double mdb_get_double(MdbHandle *mdb, int offset){double d, d2;unsigned char *c;int i;	if (offset <0 || offset+4 > mdb->pg_size) return -1;	memcpy(&d, &mdb->pg_buf[offset], 8);#ifdef HW_BIG_ENDIAN	d2 = d;	for (i=0; i<sizeof(d); i++) {		*(((unsigned char *)&d)+i) =		*(((unsigned char *)&d2)+sizeof(d)-1-i);	}#endif	mdb->cur_pos+=8;	return d;}int mdb_set_pos(MdbHandle *mdb, int pos){	if (pos<0 || pos >= mdb->pg_size) return 0;	mdb->cur_pos=pos;	return pos;}int mdb_get_pos(MdbHandle *mdb){	return mdb->cur_pos;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -