我有两个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 <<pMemory 将整个消息写入为 ascii,但我需要将其写入十六进制。
除了以十六进制写入输出外,您还有一个严重的内存泄漏。您正在错误地分配缓冲区,您没有释放。
首先,您无用地将指针复制到错误定位的缓冲区中,没有任何明显的目的。原始pMemory
指针在写出输出方面的作用与msg
副本一样好。因此,第一步是摆脱分配msg
和复制内存,没有有用的目的,并以这种方式修复内存泄漏。
现在,就十六进制而言,使用 std::hex
和 std::setw(2)
操纵器,并使用循环一次写出一个字节的字符缓冲区。
while (bufferLength)
{
logFile << std::hex << std::setw(2) << (int)(unsigned char)*pMemory;
++pMemory;
--bufferLength;
}