Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Дамп пакета


Автор: REZiaMIX 13.6.2009, 17:02
Есть данные , известна их длина.
Код

char * data;
int len;

как сформировать из этих данных дамп вида:
Код

2f 72 75 ff 6c 00

Как можно быстрее и правильней ???

Есть код:
Код

        buf = ...;
    for(UINT i=0;i!=len;++i)
    {
        char sign[32];
        itoa((int)buf[i],sign,16); 
        cons_print(sign);
    }

где cons_print - вывод в консоль smile

Но непойму откуда берутся пробелы , также вывод иногда не разделен(понятное дело), например ffffff8b. Или просто 0, 6 
http://ipicture.ru/

Автор: GoldFinch 13.6.2009, 17:07
вот так например
Код

#include <ostream>
#include <iomanip>

template<int N,typename FwdIter>
void WriteBytes(std::ostream& out,FwdIter& from,const FwdIter end)
{
    using namespace std;
    int i=0;
    for(; i<N && from!=end; ++i)
        out<<' '<<setw(2)<<static_cast<unsigned int>(static_cast<unsigned char>(*from++));
    if (from==end)
        out<<setfill(' ')<<setw((8-i)*3)<<"";
}

void dump(std::ostream& out,const char* first,const char* last)
{    
    using namespace std;

    ios_base::fmtflags savedFlags = out.flags();
    out<<hex<<right<<noshowbase<<setfill('0');
    out<<endl;

    for(const char *it1=first,*it2=first;it1!=last;)
    {        
        out<<uppercase<<setw(4)<<it1-first<<':';
        WriteBytes<8>(out,it1,last);
        out<<" |";
        WriteBytes<8>(out,it1,last);
        out<<" | "<<nouppercase;
        for(int i=0; i<16 && it2!=last; ++i, ++it2)
            out<<(*it2>=' '? static_cast<char>(*it2): '.');
        out<<endl;
    }
    out<<"- конец дампа (длина = "<<dec<<last-first<<"+2) -"<<endl<<endl;

    out.flags(savedFlags);
}

void dump(std::ostream& out,const char* ptr,size_t siz)
{
    dump(out,ptr,ptr+siz);
}

Автор: REZiaMIX 13.6.2009, 17:09
Цитата(GoldFinch @ 13.6.2009,  17:07)
вот так например

Как быстро , щас проверим . Спасибо)

Автор: GoldFinch 13.6.2009, 17:10
ffffff8b это потому что у тя char а не unsigned char
чтобы вместо 0 было 00 надо 
cout<<right<<setfill('0'); cout<<setw(2)<<...

Автор: azesmcar 13.6.2009, 17:10
Цитата(REZiaMIX @  13.6.2009,  17:02 Найти цитируемый пост)
Но непойму откуда берутся пробелы

не поймуы что за функция cons_print?

Код

for (unsigned int i = 0; i < length; ++i)
{
    printf("%x ", ptr[i]);
}

Автор: REZiaMIX 13.6.2009, 17:19
Цитата(azesmcar @ 13.6.2009,  17:10)
не поймуы что за функция cons_print?

Код

HANDLE OUTPUT_HANDLE;

void cons_print(char * text)
{
    DWORD written;
    WriteConsole(OUTPUT_HANDLE,(void*)text,strlen(text)+1,&written,NULL);
}


Не надо спрашивать , почему так сделано))
GoldFinch работает как часы , то что надо , да еще как быстро! Спасибо ))))

Добавлено @ 17:26
Интересно было бы знать как сделать это без stl
что-нить наподобие hex(char * in, char * out, int len);
 smile 

Автор: REZiaMIX 13.6.2009, 17:43
http://forum.vingrad.ru/forum/topic-260323/anchor-entry1875278/0.html
Спасибо azesmcar еще раз !)

Автор: azesmcar 13.6.2009, 17:52
Цитата(REZiaMIX @  13.6.2009,  17:43 Найти цитируемый пост)
Через поиск форума не нашел , нашел через гугл!!!
Спасибо azesmcar еще раз !) 

Цитата из того поста
Цитата(andrew_121)

Цитата(azesmcar @  22.5.2009,  20:03 Найти цитируемый пост)
пусть будет здесь, мало ли кому еще понадобится

Ты и вправду веришь что кто-то пользуется поиском? smile  smile 

 smile 
andrew_121
теперь верю smile 

Автор: andrew_121 13.6.2009, 18:22
azesmcar, Гы))) Узнаю smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)