Рассмотрим следующий фрагмент, который получает некоторые двоичные данные и записывает их в ostringstream
объект:
unsigned char* payload;
unsigned long size;
GetData(&payload, &size);
std::cout << md5(payload, size) << std::endl;
std::ostringstream stream;
stream.write((const char*)payload, size);
std::cout << md5(payload, size) << std::endl;
Проблема состоит в том, что два напечатанных значения хеша отличаются друг от друга, что означает payload
был изменен. Я пытался открыть stream
в двоичном режиме с помощью std::ostringstream stream(std::ios::out | std::ios::binary)
, это не имело значения, я не ожидал, что так или иначе.
Еще один факт: я получаю другую контрольную сумму из второго оператора печати каждый раз, когда перезапускаю программу. Первый хеш всегда один и тот же.
Теперь, как мне правильно записать мои двоичные данные в ostringstream? Может ли проблема быть брошена на const char*
(GetData
метод принимает unsigned char**
как первый параметр)?
ОБНОВЛЕНИЕ: В свете комментариев, вот еще несколько объяснений:
GetData
и фактическое письмо.GetData
, И это не обязательно, я выделил проблему на линию, где write
называется.Загадка проблемы оказывается в размере данных.
После экспериментов с различными значениями размера, было обнаружено, что ostringstream
Внутренний буфер составляет около 65 КБ, если быть точным, 65504 байта. Когда размер больше, происходят странные сдвиги и искалеченные байты.
Обходной путь должен использовать:
stream.rdbuf()->pubsetbuf((const char*)payload, payloadSize)
вместо write
метод. Но когда эта область заканчивается, полезная нагрузка будет признана недействительной и stream
больше не может использоваться где-либо еще. В моем случае это нужно было использовать где-то еще.
Это показало, что:
ostringstream
но не с хешем или чем-то еще.Других решений пока нет …