// testPrintBuffer.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <windows.h> int FnPrintBuffer(PCHAR pcPrefix, PBYTE pbcBuffer, DWORD dwLenBuffer); int main(int argc, char* argv[]) { DWORD dw = 0; PCHAR pcPrefix = NULL; PBYTE pbcBuffer = NULL; DWORD dwLenBuffer = 0; printf(">>Main/n"); pcPrefix = "按照16进制格式显示字节流"; //dwLenBuffer可以很大 dwLenBuffer = 0xf5;//0x998867;//0xf5;//0x105;//不对齐的数据 pbcBuffer = new BYTE[dwLenBuffer]; //格式化数据 for(dw = 0; dw < dwLenBuffer; dw++) { *(pbcBuffer + dw) = (BYTE)(dw % 0x100); } strcpy((PCHAR)pbcBuffer, "中文字符AndAsciiChar");//弄些可见字符 FnPrintBuffer(pcPrefix, pbcBuffer, dwLenBuffer); printf("<<Main/n"); getchar(); return 0; } int FnPrintBuffer(PCHAR pcPrefix, PBYTE pbcBuffer, DWORD dwLenBuffer) { printf("//----------------------------------------/n"); printf("//提示信息:%s/n", pcPrefix); printf("//字节流长度:%d/n", dwLenBuffer); printf("//----------------------------------------/n"); ULONG i,j,m; char buffer[0x100] = "/0"; char cBufTmp[8] = "/0"; strcpy(buffer,""); m = dwLenBuffer%16; //打印整行字符 for(i = 0; i < (dwLenBuffer -m); i++) { //格式化16进制显示部分 sprintf(cBufTmp, "%.2x", pbcBuffer[i]); _strupr(cBufTmp); strcat(buffer, cBufTmp); //每16个字符后面, 进行文本显示 if (((i + 1) % 16) == 0) { strcat(buffer, " ");//隔断(16进制显示和文本显示) for(j = (i - 15); j < (i + 1); j++) { sprintf(cBufTmp, "%c", isprint(pbcBuffer[j]) ? pbcBuffer[j] : '.' ); strcat(buffer,cBufTmp); } printf("%s/n", buffer); strcpy(buffer,""); } } if(m == 0) { return S_OK; } //打印最后一行(不满16个字符) strcpy(buffer, ""); for(i = dwLenBuffer - m; i < dwLenBuffer; i++) { sprintf(cBufTmp, "%.2x", pbcBuffer[i]); _strupr(cBufTmp); strcat(buffer, cBufTmp); } //正文补齐 for(i = 0; i < (16 - m); i++) { strcat(buffer," "); } strcat(buffer, " ");//隔断 for(j = (dwLenBuffer - m); j < dwLenBuffer; j++) { sprintf(cBufTmp, "%c", isprint(pbcBuffer[j]) ? pbcBuffer[j] : '.' ); strcat(buffer, cBufTmp); } strcat(buffer,"/n"); printf(buffer); return S_OK; }