Dev/C, C++

DisplayHex

newtype 2008. 11. 13. 08:59

패킷 또는 버퍼를 파라미터로 받아 16진수 형태로 출력을 예쁘게 해준다.

* 사용예
DisplayHex( "Send Packet", szBuf, sizeof(szBuf) );

* 결과
[ Send Packet ] =========
-----------------------------------------------------------------------
ADDR  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  0123456789ABCDEF
-----------------------------------------------------------------------
0000  54 65 73 74 20 50 61 63 6B 65 74 20 53 61 6D 70  Test Packet Samp 
0010  6C 65 20 44 61 74 61 2E 2E 2E 2E 2E 20 5E 5E 00  le Data..... ^^. 
0020  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 
0030  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 
0040  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 
0050  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 
0060  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 
0070  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 
-----------------------------------------------------------------------

* 소스
void DisplayHex( char *title, char *pPacket, int size )
{
    long    i                   = 0;
    long    j                   = 0;
    long    lTotal              = 0;
    char    szBinBuff[64]       = {0,};
    char    szASCIIBuff[18]     = {0,};
    u_char  byBuff              = 0;
    char    cpWrk[256]          = {0};
	char    szBuf[2048]			= {0,};

    printf("[ %s ] =========\n", title );
    printf("-----------------------------------------------------------------------\n");
    printf("ADDR  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  0123456789ABCDEF\n");
    printf("-----------------------------------------------------------------------\n");

    for (i = 0; i * 0x10 < size; i++) 
	{
        memset(szBinBuff  , 0, sizeof(szBinBuff  ));
        memset(szASCIIBuff, 0, sizeof(szASCIIBuff));
        for (j = 0; j < 0x10; j++) 
		{
            byBuff = (u_char)*(((u_char*)pPacket) + i * 0x10 + j);
            sprintf(szBinBuff   + j * 3, "%02X ", byBuff);
            sprintf(szASCIIBuff + j    , "%c"   , 
                ((byBuff >= 32) && (byBuff <= 126)) ? byBuff : '.');
            lTotal ++;
            if (lTotal >= size) 
			{
                break;
            }
        }

		sprintf( szBuf, "%04X  %-47.47s  %-17.16s\n", i * 0x10, szBinBuff, szASCIIBuff);
        printf( szBuf );
    }

    printf("-----------------------------------------------------------------------\n");
}


반응형