公司要让我读一个2进制的数据结构包,但是又不给结构包的详细文档,我又是初学者,实在读不动了,下面是关键部分,C++的代码我看不下去了,太难懂了,逼着自己学了段时间的C,但遇到大的代码,还是理不清楚思路,麻烦大哥们给我转转,谢谢了,代码不长,有的结构体我就不贴出来了,你们不好描述的,就直接用中文,真的非常感谢了
int recflaglen = 0; //每个记录前面预留的标志字节
int16 nIndCurField = 0; //字段数
int16 nFieldWidth;
DBF_LONG lFldOffset = 1; //每个记录的长度
boolean bIsMoreFields = TRUE;
//字段数
int16 nFieldCount = (m_DBFHead.data_offset - m_DBFHead.reserved - sizeof(DBF_HEAD) - 1)/sizeof(FIELD_REC);
FIELD_REC* pFields = (FIELD_REC*)MALLOC(nFieldCount * sizeof(FIELD_REC));
recflaglen = ((nFieldCount + T_BIT-1) / T_BIT); //
lFldOffset += recflaglen; while(bIsMoreFields && nIndCurField < nFieldCount)
{
if(IFILE_Read(hfile,&pFields[nIndCurField],sizeof(FIELD_REC)) != sizeof(FIELD_REC))
{
return;
}
if(bIsMoreFields)
{
bIsMoreFields = (pFields[nIndCurField].field_name[0] != 0x0D);
if(bIsMoreFields)
{
switch(pFields[nIndCurField].field_type)
{
case FLD_TYPE_NUMERIC:
case FLD_TYPE_CURRENCY:
case FLD_TYPE_FLOAT:
case FLD_TYPE_DOUBLE:
case FLD_TYPE_INTEGER:
nFieldWidth = pFields[nIndCurField].len_info.num_size.len;
break;
default:
nFieldWidth = pFields[nIndCurField].len_info.char_len;
}
pFields[nIndCurField].field_offset = lFldOffset;
lFldOffset = lFldOffset + nFieldWidth;
nIndCurField++;
}
}
}
int recflaglen = 0; //每个记录前面预留的标志字节
int16 nIndCurField = 0; //字段数
int16 nFieldWidth;
DBF_LONG lFldOffset = 1; //每个记录的长度
boolean bIsMoreFields = TRUE;
//字段数
int16 nFieldCount = (m_DBFHead.data_offset - m_DBFHead.reserved - sizeof(DBF_HEAD) - 1)/sizeof(FIELD_REC);
FIELD_REC* pFields = (FIELD_REC*)MALLOC(nFieldCount * sizeof(FIELD_REC));
recflaglen = ((nFieldCount + T_BIT-1) / T_BIT); //
lFldOffset += recflaglen; while(bIsMoreFields && nIndCurField < nFieldCount)
{
if(IFILE_Read(hfile,&pFields[nIndCurField],sizeof(FIELD_REC)) != sizeof(FIELD_REC))
{
return;
}
if(bIsMoreFields)
{
bIsMoreFields = (pFields[nIndCurField].field_name[0] != 0x0D);
if(bIsMoreFields)
{
switch(pFields[nIndCurField].field_type)
{
case FLD_TYPE_NUMERIC:
case FLD_TYPE_CURRENCY:
case FLD_TYPE_FLOAT:
case FLD_TYPE_DOUBLE:
case FLD_TYPE_INTEGER:
nFieldWidth = pFields[nIndCurField].len_info.num_size.len;
break;
default:
nFieldWidth = pFields[nIndCurField].len_info.char_len;
}
pFields[nIndCurField].field_offset = lFldOffset;
lFldOffset = lFldOffset + nFieldWidth;
nIndCurField++;
}
}
}
//字段属性数据
left = m_DBFHead.reserved;
fslist = (FIELD_SPEC*)MALLOC(sizeof(FIELD_SPEC) * m_DBFFields.m_nFieldCount);
if(left > 0)
{
int pos = 0;
//为字段属性数据分配空间,统一存放的
char* buffer = (char*)MALLOC(left);
IFILE_Seek(hfile,_SEEK_CURRENT,1);
left = IFILE_Read(hfile,buffer,left);
// m_sTable_spec-表格信息
MEMCPY(&pos,&m_DBFHead.filler[0],4);
m_sTable_spec = (AECHAR*)&buffer[pos];
// m_sTable_valid-表格的审核关系
MEMCPY(&pos,&m_DBFHead.filler[4],4);
m_sTable_valid = (AECHAR*)&buffer[pos];
//解析审核关系,形成审核条件表达式
CBWStrToken* tok = new CBWStrToken(m_sTable_valid,L';');
i = tok->tokenNum();
validnum = i;
validlist = (TABLE_VALID*)MALLOC(sizeof(TABLE_VALID) * i);
MEMSET(validlist,0,sizeof(TABLE_VALID) * i);
AECHAR* str;
AECHAR* tmp1;
char* cbuf;
for(int m=0; m<i; m++)
{
str = tok->nextString();
if(str && str[0])
{
tmp1 = WSTRCHR(str, L',');
if(tmp1)
{
*tmp1 = 0;
len = WSTRLEN(str);
cbuf = (char*)MALLOC(len + 1);
WSTRTOSTR(str,cbuf,len + 1);
validlist[m].validstr = cbuf;
*tmp1 = L',';
str = tmp1 + 1;
validlist[m].errstr = WSTRDUPSAFE(str);
}
}
}
delete tok;
// m_sTable_other-表格其他数据
MEMCPY(&pos,&m_DBFHead.filler[8],4);
m_sTable_other = (AECHAR*)&buffer[pos];
//表格附加字段定义
MEMCPY(&pos,&m_DBFHead.filler[12],4);
if(pos>0)
{
extraflds = (AECHAR*)&buffer[pos];
}
//解析每个字段字段属性
FIELD_SPEC* fs;
for(i=0;i<m_DBFFields.m_nFieldCount;i++)
{
fs = &fslist[i];
//字段标题
MEMCPY(&pos,&m_DBFFields.m_pFields[i].filler[0],4);
fs->field_title = (AECHAR*)&buffer[pos];
//字段说明
MEMCPY(&pos,&m_DBFFields.m_pFields[i].filler[4],4);
fs->field_info = (AECHAR*)&buffer[pos];
//字段自动赋值
MEMCPY(&pos,&m_DBFFields.m_pFields[i].filler[8],4);
fs->field_val = (AECHAR*)&buffer[pos];
}
otherdata = (AECHAR*)buffer;
}
IFILE_Release(hfile); m_HeadSize = 32 + extralen + 4;
m_DBFHead.last_rec = recnum; m_Error = FALSE;
m_bOpen = TRUE;
}
我没别的啥要求了,只求能转成java版本的,中间带点中文代码表示也无所谓,我自己应该能搞定
要是能转成java代码,我再琢磨琢磨,应该就没问题了
int16 nIndCurField = 0; //字段数
int16 nFieldWidth;
DBF_LONG lFldOffset = 1; //每个记录的长度
boolean bIsMoreFields = TRUE;
//字段数
int16 nFieldCount = (m_DBFHead.data_offset - m_DBFHead.reserved - sizeof(DBF_HEAD) - 1)/sizeof(FIELD_REC);//多少个字段
FIELD_REC* pFields = (FIELD_REC*)MALLOC(nFieldCount * sizeof(FIELD_REC)); //分配足够的内存空间用于存储这些值
recflaglen = ((nFieldCount + T_BIT-1) / T_BIT); //
lFldOffset += recflaglen; while(bIsMoreFields && nIndCurField < nFieldCount)
{
if(IFILE_Read(hfile,&pFields[nIndCurField],sizeof(FIELD_REC)) != sizeof(FIELD_REC))//从hfile读一个字段到pfilds[]
{
return;
}
if(bIsMoreFields)
{
bIsMoreFields = (pFields[nIndCurField].field_name[0] != 0x0D);//pfilds[].field_name应不为oxoD
if(bIsMoreFields)
{
switch(pFields[nIndCurField].field_type) //根据field_type求宽度
{
case FLD_TYPE_NUMERIC:
case FLD_TYPE_CURRENCY:
case FLD_TYPE_FLOAT:
case FLD_TYPE_DOUBLE:
case FLD_TYPE_INTEGER:
nFieldWidth = pFields[nIndCurField].len_info.num_size.len;
break;
default:
nFieldWidth = pFields[nIndCurField].len_info.char_len;
}
pFields[nIndCurField].field_offset = lFldOffset;
lFldOffset = lFldOffset + nFieldWidth; //宽度累加求和
nIndCurField++; //字段累加计数
}
}
}
只需要在那地方给出说明就可以了
也不是一定要给我转换代码,只需要把每句话给我写上说明,我明白了,我自己也能写出对应的JAVA代码的
希望哪位高人,帮忙写下注释