Редактировать 1: Я определил шестнадцатеричную комбинацию, которая вызывает эту проблему, но все еще не может ее исправить. См. Редактирование внизу:
Оригинальный пост: я пытаюсь передать данные с датчика в двоичный файл. Я использую пример кода производителя и DLL для захвата 4096 байт за раз, а затем я пытаюсь записать его в файл. Мой окончательный размер файла варьируется от 4100 до 4114 байт, и дополнительные биты случайным образом распределяются по всему файлу.
Данные с датчика заканчиваются без знака длиной 4096. Когда я отправляю каждый символ в std :: cout, значения верны (поэтому датчик и DLL для связи с ним работают). Однако записать весь символ в двоичный файл (используя ofstream :: write) не удается, так же как и запись каждого символа по одному (используя ofstream :: put). В приведенном ниже коде я удалил проверку ошибок при создании файла и т. Д.
unsigned int uiread = 4096;
unsigned char ccdbuf[4096];
ofstream ofile;
/* DLL call stuff removed since it's hardware-specific */
ofile.open("camdata.bin");
// ofile.write(reinterpret_cast<const char*>(ccdbuf), uiread); // 4100 - 4114
for (int ii = 0; ii < uiread; ii++)
{
std::cout << (int)ccdbuf[ii] << "\n";
ofile.put(ccdbuf[ii]); // 4100 - 4114
// ofile.put(5); // 4096
}
ofile.close();
Закомментированная строка ofile.write была предоставлена мне производителем сенсора. В конце комментария подчеркивается, что полученная длина файла варьируется от 4100 до 4114 байт, а дополнительные биты разбросаны по всему файлу.
Строка 'std :: cout' в цикле for показывает правильные значения.
Если я напишу '5' 4096 раз, файл будет именно тем, что я ожидаю (4096 байт). Но запись символа вектора по одному элементу за раз приводит к переменной длине двоичной записи (больше 4096) со случайным расположением дополнительных битов.
Я подозреваю, что моя проблема в преобразовании неподписанного символа в тип, ожидаемый для ofstream :: write (const char?), Но я просто не знаю, как обойти это. Заранее спасибо.
Редактировать 1:
Я определил, что двухбайтовая строка, которая изначально вызывает это поведение, всегда заканчивается 0x0A, но первые неправильно записанные данные на самом деле являются первым байтом пары. Таким образом, шестнадцатеричный эквивалент текстового вывода, отправляемого в std: cout, может быть 0x890A, 0xC00A или 0xC20A, но когда вывод прерывается, эта пара байтов всегда записывается как 0x0A0D.
Глядя на биты, составляющие первый байт, похоже, не видно последовательности битов, предшествующих 0x0A, и не каждая двухбайтовая пара, заканчивающаяся 0x0A, вызывает ошибку. Поскольку ofstream :: put находится внутри цикла for, мне кажется странным, что первой ошибкой в записи будет цикл перед байтом значения 0x0A.