VC++模拟HashTable
/*
作者:陈声涛
用途:用于存储大信息量多字段数据的存储,尤其用于网络上多字段数据的传输。传输双方只需要协定传输的数据的字段即可。
*/
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#define MEMSIZE 4096
class HashTable
{
private:
char * IntToString(int TheInt);
//Int类型的数据转换成字符串,便于网络传输
int StringToInt(char * TheString);
//字符串转换成Int类型的数据
void StoreString(char *DestSTR,char * TheString);
//将数据TheString存储到DestSTR最后
//从完整的HashTable中获取第一组数据
int GetLength(char * TheHashTable);
char * GetValue(char * TheHashTable,int ValueLength,char *Value);
public:
char * TheHashTable;
HashTable();
//将列名Column和值Value组添加到HashTable中
void Add(char * Column,char * Value);
//从HashTable中获取列名为Column的值
char * GetValue(char * Column);
};
HashTable::HashTable()
{
TheHashTable=(char *)calloc(MEMSIZE,sizeof(char));
}
char * HashTable::IntToString(int TheInt)
{
char * TheString=(char *)calloc(MEMSIZE,sizeof(char));
sprintf(TheString,"%d",TheInt);
return TheString;
}
int HashTable::StringToInt(char * TheString)
{
int TheInt=atoi(TheString);
return TheInt;
}
void HashTable::StoreString(char * DestSTR,char * TheString)
{
int StringLength=strlen(TheString);
memcpy(DestSTR+strlen(DestSTR),TheString,StringLength);
}
int HashTable::GetLength(char *TheHashTable)
{
int i=1;
char * ValueSTR=(char*)calloc(MEMSIZE,sizeof(char));
while(TheHashTable[i]!=']')
{
ValueSTR[i-1]=TheHashTable[i];
i++;
}
return StringToInt(ValueSTR);
}
char * HashTable::GetValue(char * TheHashTable,int ValueLength,char * Value)
{
int i=1;
char * ValueSTR=(char*)calloc(MEMSIZE,sizeof(char));
memcpy(ValueSTR,TheHashTable+1+2+strlen(IntToString(ValueLength)),ValueLength);
sprintf(Value,"%s",ValueSTR);
return TheHashTable+ValueLength+2+2+strlen(IntToString(ValueLength));
}
void HashTable::Add(char * Column,char * Value)
{
int ColumnLength=strlen(Column);
int ValueLength=strlen(Value);
//添加Column长度
StoreString(TheHashTable,"[" );
StoreString(TheHashTable, IntToString(ColumnLength));
StoreString(TheHashTable, "]");
//添加Column
StoreString(TheHashTable,"[" );
StoreString(TheHashTable, Column);
StoreString(TheHashTable, "]");
//添加Value长度
StoreString(TheHashTable,"[" );
StoreString(TheHashTable, IntToString(ValueLength));
StoreString(TheHashTable, "]");
//添加Value
StoreString(TheHashTable,"[" );
StoreString(TheHashTable, Value);
StoreString(TheHashTable, "]");
}
char * HashTable::GetValue(char *Column)
{
char * TheSTR=(char*)calloc(MEMSIZE,sizeof(char));
sprintf(TheSTR,"%s",TheHashTable);
char * Values=(char*)calloc(MEMSIZE,sizeof(char));
int t=0;
while(!isspace(TheSTR[0]))
{
t=GetLength(TheSTR);
TheSTR=GetValue(TheSTR,t,Values);
if(!memcmp(Values,Column,t))
{
t=GetLength(TheSTR);
TheSTR=GetValue(TheSTR,t,Values);
return Values;
}
}
return "不存在";
}
//调用示例
void main()
{
HashTable MyTable;
MyTable.Add("version","2013-03-01");
MyTable.Add("c1","aaa dfwerwe f");
MyTable.Add("c2","456aa!@$#%$ dfwerwe f");
MyTable.Add("c3","aa^&*))a erwe f");
printf("HashTable结构示例 :%s\n\n\n",MyTable.TheHashTable);
printf("表项version:%s\n",MyTable.GetValue("version"));
printf("表项c1:%s\n",MyTable.GetValue("c1"));
printf("表项c2:%s\n",MyTable.GetValue("c2"));
printf("表项c3:%s\n",MyTable.GetValue("c3"));
printf("表项c1:%s\n",MyTable.GetValue("c1"));
printf("表项version:%s\n",MyTable.GetValue("version"));
}

浙公网安备 33010602011771号