C ++ Rook ie нужна помощь для устранения проблемы двоичной записи ofstream - PullRequest
0 голосов
/ 02 февраля 2020

Я пишу небольшую программу командной строки, которая пишет двоичный файл. Я использую ofstream write (открытый как бинарный файл) для вывода файла. Проблема в том, что когда я запускаю программу, полученный файл не соответствует данным, которые я представил команде записи.

Мои вопросы:

  • Что не так с моим кодом ?
  • Как я могу это отладить?

Спасибо и всего наилучшего ... Пол

Вот подробности.

Ограничение вывода до 196 байт, вывод выглядит так:

text

Если я добавлю еще 68 байтов к выводу, я получу это:

text

Обратите внимание, как файл был поврежден со смещением 0x00000010, с перезаписанными данными и вставленными случайными данными. Проблема может быть воссоздана с помощью этого кода:

#include <iostream>
#include <fstream>
#include <vector>

#include "Windows.h"

class PcapNgFile
{
public:
    std::ofstream pcapng;
    PcapNgFile(std::wstring fileName);
    void pcapWrite();
    void closePcapng() { pcapng.close(); };
};

PcapNgFile::PcapNgFile(std::wstring fileName)
    : pcapng(fileName.c_str(), std::ios::binary | std::ios::out)
{
    if (pcapng.is_open())  std::wcout << "Output file: " << fileName << std::endl;
}

void PcapNgFile::pcapWrite()
{
    std::vector<uint8_t> dataOut1
    {
      0x0d, 0x0a, 0x0a, 0x0d, 0x70, 0x00, 0x00, 0x00, 0x4d, 0x3c, 0x2b, 0x1a, 0x01, 0x00, 0x00, 0x00,
      0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x18, 0x00,
      'M', 'i', 'c', 'r','o', 's', 'o', 'f', 't', ' ',
      'W', 'i', 'n', 'd', 'o', 'w', 's', ' ', 'S', 'e', 'r', 'v', 'e', 'r',
      0x04, 0x00, 0x2b, 0x00,
      'M', 'i', 'c', 'r','o', 's', 'o', 'f', 't', ' ', 'I', 'n', 't', 'e', 'r', 'n', 'e', 't', ' ',
      'I', 'n', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', ' ', 'S', 'e', 'r', 'v', 'i', 'c', 'e', 's',
      ' ', '8', '.', '5', 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
      0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,
      0x02, 0x00, 0x05, 0x00, 'B', 'a', 'b', 'e','l', 0x00, 0x00, 0x00, 0x03, 0x00, 0x13, 0x00,
      'B', 'a', 'b', 'e', 'l', ' ', 'D', 'D', 'D', ' ', 'C', 'o', 'n', 'v', 'e', 'r', 't', 'e', 'r',
      0x00, 0x38, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x86, 0x03, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x62, 0x03, 0x00, 0x00, 0x62, 0x03, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x0b, 0xab, 0xe1,
      0x00, 0x00, 0x00, 0x0b, 0xab, 0xe1,
      0xba, 0xbe, 0x10, 0x00, 0x00, 0x80,
      0x00, 0x00, 0x00, 0x00,
      0x03, 0x00, 0x65, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x2c, 0x03, 0x00, 0x00
    };

    pcapng.write((char*)&(dataOut1[0]), dataOut1.size());

    return;
}

int wmain(int argc, wchar_t** argv)
{
    PcapNgFile* outFile = new PcapNgFile(L"c:\\traces\\bug.pcapng"); // output file

    outFile->pcapWrite();
    outFile->closePcapng();

    return (0);
}

Я использую Visual Studio 2019 Community Edition на Windows 10.

1 Ответ

0 голосов
/ 05 февраля 2020

Ну, это очень расстраивает. Я использовал Notepad ++ с шестнадцатеричным плагином для просмотра выходных данных на одной машине и UltraEdit на другой. Проблема заключается в том, что Notepad ++ случайно отображает содержимое неправильно, тогда как UltrEdit показывает ожидаемый результат.

Так что просто чтобы избежать всех сомнений, это проблема Notepad ++, а не проблема записи ofstream. Думаю, нет ничего удивительного.

...