公司要让我读一个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++;
}
}
}

解决方案 »

  1.   

    还有一段,就这两段
    //字段属性数据
    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;
    }
      

  2.   

    转java是为了用还是为了让你看懂?
      

  3.   

    只要求转成java版的,意思一样,我应该看的懂
    我没别的啥要求了,只求能转成java版本的,中间带点中文代码表示也无所谓,我自己应该能搞定
      

  4.   

    我不懂C++啊,没办法,才开始工作,而且数据结构组织太复杂了,我只有上网求助了
    要是能转成java代码,我再琢磨琢磨,应该就没问题了
      

  5.   

    我看lz干脆把标题改成“求用c++写java程序高手”,呵呵...
      

  6.   

    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))//从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++;                                                 //字段累加计数
                }
            }
        }
      

  7.   

    有些是转不了的,例如MALLOC,sizeof这两个函数就没有办法转还有指针操作符号*也没有办法,如果用java里面的引用来对应这里的指针的话,却又无法找到合适的类型。
      

  8.   

    不能转的,我希望用汉字代替代码
    只需要在那地方给出说明就可以了
    也不是一定要给我转换代码,只需要把每句话给我写上说明,我明白了,我自己也能写出对应的JAVA代码的
    希望哪位高人,帮忙写下注释