Похоже, char
подписано в вашей системе, и вы стали жертвой расширения знака.Например, 0x90 является отрицательным, поэтому при преобразовании в int
этот негатив должен быть перенесен, что приведет к 0xffffff90.
Solution
Считайте файл в unsigned char
,или uint8_t
из <cstdint>
, если он доступен, вместо массива char
.
char * memblock;
становится
uint8_t * memblock;
затем
memblock = new char[size];
становится
memblock = new uint8_t[size];
и не конвертирует его в string
позже.
string str = string(memblock, size);
бессмысленно, вы могли бы также легко прочитать из memblock
и отменитьнеподписанность мы установили ранее.Просто прочитайте из memblock
Не забудьте
delete[] memblock;
, когда вы закончите.Это приводит к
Лучшее решение
Использование std::vector
.Он убирает за собой.
std::vector<uint8_t> memblock(size);
file.seekg(0, ios::beg);
file.read(reinterpret_cast<char*>(memblock.data()), size);
//or file.read(reinterpret_cast<char*>(&memblock[0]), size); if no or data method