переписать реализацию на STL
От: MartinIden  
Дата: 06.10.09 17:30
Оценка:
всем добрый.
ниже приведу реализацию, которая написана на чистом Си.
Буду вам очень благодарен если поможите использование массивов но на STL.
главные учавствующие эл-ты — pIp_packet[], ppIp_packet[][], parr_sequence_number[]
смысл действий заключается в след.:
1) читается бинарный файл
2) содержимое бинарного файла складируем в pIp_packet, для этого используем вспомогат. эл-т pIp_packet_tmp.
3) дальше из pIp_packet_tmp распихиваю в массив ppIp_packet, каждый эл-т является Ip пакет.
4) в каждом Ip пакете есть дополнит. поле, назовем X1, так вот эл-т этого поля будем еще складировать в парал-ный массив parr_sequence_number.

Задача:
Хотелось бы реализовать на STL сортировку эл-тов ppIp_packet (т.е. Ip пакетов) используя сортировку parr_sequence_number, который однозначно связаны.

На С все прекрасно работат, сортировку сделал ч\з указатели.

// создаю массив ppIp_packet[] - складируются Ip пакеты 
Fun1() 
{
    bool X2 = false;
    
     fl_in.Open(s_dest_file, CFile::modeRead | CFile::typeBinary,  &e);
     ULONGLONG i_filesize = fl_in.GetLength();
     
    // выделяю память под чтение файла
        if( i_filesize > 1024*1024*200)
        {
            /*ULONGLONG*/ read_block1024_1024_200 = 1024*1024*200;
            
            read_block_200Mb = new u_char [int(read_block1024_1024_200)];
            pIp_packet    = (u_char*) new u_char[int(read_block1024_1024_200)];
            

            X2 = true;
        }
        else
        {
            read_block_200Mb = new u_char [int(i_filesize)];
            pIp_packet    = (u_char*) new u_char[int(i_filesize)];
            
            X2 = false;

        }
        
        // создаю временную перемен. для использов. pIp_packet
        u_char *pIp_packet_tmp = pIp_packet; // !!!


    do // читаю файл по большим кускам в переменную и так до конца !
    {

        if(X2)
        {
            read_block1024_1024_200 = fl_in.Read(read_block_200Mb, 1024*1024*200) ;
        }
        else
        {
            read_block1024_1024_200 = fl_in.Read(read_block_200Mb, int(i_filesize)) ;
        }
        ULONGLONG inc_read_block_200Mb = 0;
        if(!read_block1024_1024_200)
        {
            //MessageBox("Файл не прочитался при  %d -ом чтении !", inc_read);
            delete [] pIp_body_buff;
            delete [] pIp_h_buff;
            break;
        }

        do // читаю файл по пакетно и так до конца !
        {
            --inc_read_block_200Mb;
            memcpy(pIp_h_buff,&read_block_200Mb[inc_read_block_200Mb], 20);

            ip_h_ver = (int)getBits(pIp_h_buff,0,0, 4);
            s_ip_ver.Format("%d", ip_h_ver);

            ip_h_len = (int)getBits(pIp_h_buff,0,4, 4);
            s_ip_h_len.Format("%d", ip_h_len);

            ip_full_length = (int)getBits(pIp_h_buff,0,16, 16);
            s_ip_len.Format("%d", ip_full_length);

            ip_h_protocol = (int)getBits(pIp_h_buff,0,72, 8);
            s_protocol.Format("%d", ip_h_protocol);

            pIp_body_buff = (u_char*) new u_char[ip_full_length-ip_h_len*4];
            inc_read_block_200Mb += ip_h_len*4;
            memcpy(pIp_body_buff,&read_block_200Mb[inc_read_block_200Mb], ip_full_length-ip_h_len*4);
            inc_read_block_200Mb += ip_full_length-ip_h_len*4;
            ip_body = ip_full_length-ip_h_len*4;


            // заполняю pIp_packet_tmp[] 
            memcpy(pIp_packet_tmp, pIp_h_buff, ip_h_len*4);
            pIp_packet_tmp+=ip_h_len*4;        
            memcpy(pIp_packet_tmp, pIp_body_buff, ip_body);
            pIp_packet_tmp+=ip_body;


            delete [] pIp_body_buff;
            pIp_body_buff = NULL;

            inc_pack++;

        }while(inc_read_block_200Mb < read_block1024_1024_200);

    }while(read_block1024_1024_200>1);
    
    ...
    ppIp_packet = new u_char* [inc_pack];

    // содержимое pIp_packet_tmp[] теперь распихиваю по пакетно в каждый ppIp_packet[i]
    for(int i=0; i<inc_pack; i++)
    {
        ppIp_packet[i] = new u_char [(int)getBits(pIp_packet_tmp,0,16, 16)];
        memcpy(ppIp_packet[i], pIp_packet_tmp, (int)getBits(pIp_packet_tmp,0,16, 16));
        pIp_packet_tmp+=getBits(pIp_packet_tmp,0,16, 16);
    }
        FullArrSequenceNumber();
}

// Из каждого ppIp_packet[i] извлекаю значения поля и записываю в parr_sequence_number[i]
int FullArrSequenceNumber()
{
    int ip_h_len, ip_len, ip_body; 

    parr_sequence_number = new int [inc_pack];
    u_char *p_tmp;
    int old_sequence_number = 0;

    if(ppIp_packet != NULL)
    {
        for(int i=0; i < inc_pack; i++)
        {
            ip_h_len = (int)getBits(ppIp_packet[i],0, 4, 4);
            ip_h_len *=4;
            ip_len = (int)getBits(ppIp_packet[i],0,16, 16);
            ip_body = ip_len - ip_h_len;
            p_tmp = new u_char [ip_body];

            memcpy(p_tmp, &ppIp_packet[i][ip_h_len], ip_body);
            //GRE_analyse(p_tmp);

            if((int)getBits(p_tmp,0, 3, 1) == 0x1)
            {
                parr_sequence_number[i] = (int)getBits(p_tmp,0, 64, 32);
                old_sequence_number        = parr_sequence_number[i];
            }
            else
            {
                parr_sequence_number[i] = old_sequence_number;
            }
        }
        return true;
    
    }
    
    return false;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.