将字符缓冲区转换为十六进制并写入文件 (VC++)



我有两个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::hexstd::setw(2) 操纵器,并使用循环一次写出一个字节的字符缓冲区。

while (bufferLength)
{
    logFile << std::hex << std::setw(2) << (int)(unsigned char)*pMemory;
    ++pMemory;
    --bufferLength;
}

最新更新