Вывод бинарника на консоль

Тема в разделе "WASM.BEGINNERS", создана пользователем _Juicy, 10 фев 2012.

  1. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Нужна процедура, получающая на входе двоичный буфер и выдающая на консоль красивую распечатку как в любом хекс-редакторе, чтоб слева хекскоды, справа символы, по 0x10 штук в строке.
    Виндовс, си.
    Заранее спасибо.
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Код (Text):
    1. Offset = 0;
    2.  
    3. for (int i=0; i<=DataSize-1; i++)
    4. {
    5.     if (i%16 == 0) printf("%08x  ", Offset);
    6.     printf("%02X ", Data[i]);
    7.     if (!((i+1)%16))
    8.     {
    9.         printf("  ");
    10.         for (int j=15; j>=0; j--)
    11.             printf("%c", (Data[i-j] < ' ')?'.':Data[i-j]);
    12.         printf("\n");
    13.     }
    14.     Offset++;
    15. }
     
  3. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    rmn
    Работать будет, вот только с одни но ! Очень медленно, закинте хотя бы метр , и можно смело идти пить чай:)

    Squash
    Так что делаем по похожему алгоритму только изайем буффер, соответсвенно форммулируем строку сразу.
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    shchetinin
    Ну конечно, небольшая доработка напильником нужна. Это же просто пример :)
    Так же следует добавить заполнение пробелами пустых позиций, если размер данных не кратен 16-ти
     
  5. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Squash
    Ну и главное: шрифт нужен "моноширинный", иначе вся "красота" исчезнет.
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    valterg
    Стопудов. Ведь по умолчанию моноширный шрифт в консоли — это такая редкость.
     
  7. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    Код (Text):
    1. void HexDumpQLine(BYTE* pBuf,DWORD dwSize,DWORD dwStart,FILE* pOut)
    2. {
    3.    const int   BLOCK_SIZE = 0x10;     // One Line
    4.    
    5.    DWORD    dwOfs = dwStart - (dwStart % 16);
    6.    
    7.    if (IsBadReadPtr(pBuf + dwOfs,BLOCK_SIZE * 5))
    8.    {
    9.       return;
    10.    }
    11.    
    12.    while (dwOfs < (dwStart + BLOCK_SIZE * 4))
    13.    {
    14.       fprintf(pOut,"%08X: ",dwOfs);
    15.      
    16.       for (int ii = 0; ii < BLOCK_SIZE; ++ii)
    17.       {
    18.          if ((dwOfs + ii) < dwSize)
    19.          {
    20.             fprintf(pOut," %02X",pBuf[dwOfs + ii]);
    21.          }
    22.          else
    23.          {
    24.             fprintf(pOut,"   ");
    25.          }
    26.       }
    27.      
    28.       fprintf(pOut,"  ");
    29.      
    30.       for (ii = 0; ii < BLOCK_SIZE; ++ii)
    31.       {
    32.          BYTE     byChr = pBuf[dwOfs + ii];
    33.          
    34.          if ((dwOfs + ii) < dwSize)
    35.          {
    36.             fprintf(pOut,"%c",IsPrintable(byChr)  ?  byChr  :  '.');
    37.          }
    38.          else
    39.          {
    40.             fprintf(pOut," ");
    41.          }
    42.       }
    43.      
    44.       fprintf(pOut,"\n");
    45.      
    46.       dwOfs += BLOCK_SIZE;
    47.    }
    48. }