Computing hex dump Orchistro 2013. 8. 2. 12:21 #include <stdint.h> #include <stdio.h> #include <iostream> #include <assert.h> static void dumpHex(const void *aBuffer, const size_t aBufferSize, size_t aWidth) { char sHexBuffer[6] = {0}; size_t sLineSize; size_t sLineLength; /* the number of bytes printed in a line */ char *sLine = NULL; size_t sPos = 0; size_t i; const uint8_t *sBuffer = (const uint8_t *)aBuffer; const size_t sAddrAreaSize = 6; /* address column (e.g. FFFF ) */ const size_t sColWidth = 4; /* the number of bytes that consists a column (FF FF FF FF FF FF FF FF ) */ aWidth = ((aWidth + (sColWidth - 1)) / sColWidth) * sColWidth; const size_t sHexAreaSize = (aWidth * 3) + /* 3 chars required to display a byte (FF ) - including trailing space */ (aWidth / sColWidth); /* to distinguish a column by inserting additional space */ const size_t sCharAreaStartPos = sAddrAreaSize + sHexAreaSize; sLineSize = sAddrAreaSize + sHexAreaSize + aWidth + 1; /* Null terminator */ sLine = (char *)malloc(sLineSize); assert(sLine != NULL); *(sLine + sLineSize - 1) = '\0'; while (sPos < aBufferSize) { memset(sLine, ' ', sLineSize - 1); sLineLength = ((aBufferSize - sPos) > aWidth) ? aWidth : (aBufferSize - sPos); /* Address */ snprintf(sHexBuffer, sizeof(sHexBuffer), "%04X:", (uint16_t)(sPos & 0xFFFF)); memcpy(sLine, sHexBuffer, 5); /* Hex part */ for (i = 0; i < sLineLength; i++) { snprintf(sHexBuffer, sizeof(sHexBuffer), "%02X", *(sBuffer + sPos + i)); memcpy(sLine + sAddrAreaSize + (i * 3) + (i / sColWidth), sHexBuffer, 2); } /* Character part */ for (i = 0; i < sLineLength; i++) { uint8_t sByte = *(sBuffer + sPos + i); *(sLine + sCharAreaStartPos + i) = (sByte < 127 && sByte >= 0x20) ? (char)sByte : '.'; } sPos += aWidth; std::cout << sLine << "\n"; } free(sLine); fflush(stdout); } int32_t main(void) { uint8_t sBuffer[1063]; size_t i; for (i = 0; i < sizeof(sBuffer); i++) { sBuffer[i] = (uint8_t)(i & 0xff); } dumpHex(sBuffer, sizeof(sBuffer), 18); return 0; } 저작자표시 비영리 변경금지 (새창열림)