我有两个DWORD。一个是指向我必须阅读的内存部分的指针,另一个是消息长度。 我需要复制“缓冲区”并将其保存为十六进制文件。另外我还要保存其他数据。 到目前为止,我有:
ofstream logFile;
logFile.open("log.txt");
int coutSend = 0;
int countRecv = 0;
void SavePacket(DWORD MemoryPointer, DWORD BufferLength, bool Direction)
{
if (Direction == 0) {
countSend++;
}
else
{
countRecv++;
}
time_t now = time(0);
tm *ltm = localtime(&now);
char * pMemory= reinterpret_cast<char*>(MemoryPointer);
char * msg= new char[BufferLength];
strcpy_s(msg, BufferLength, pMemory);
logFile << ltm->tm_hour << ":" << ltm->tm_min << ":" << ltm->tm_sec << "," << Direction << "," << hex << msg << endl;
}
所以如果我logFile&lt;&lt; pMemory将整个消息写为ascii,但我需要将其写为十六进制。
答案 0 :(得分:1)
除了以十六进制编写输出外,还有一个主要的内存泄漏。你正在制作一个缓冲区,你不会自由移动。
首先,你无用地将指针复制到malloced缓冲区中,没有任何明显的目的。您的原始pMemory
指针与将msg
副本写出输出的工作一样好。所以,第一步是摆脱分配msg
并复制内存,没有用处,并以这种方式修复内存泄漏。
现在,就编写十六进制而言,使用std::hex
和std::setw(2)
操纵器,并使用循环一次写出一个字节的字符缓冲区。
while (bufferLength)
{
logFile << std::hex << std::setw(2) << (int)(unsigned char)*pMemory;
++pMemory;
--bufferLength;
}