Здравствуйте. Есть mkv файл. Если открываю через блокнот или в бинарном режиме в visual studio, то получаю набор символов вида "→EЯ??B┼?☺Bт?♦BуB'?matroskaB╪?☺". Но случайно открыл в sublime text, так там сразу получился идеальный (для дальнейшей обработки) результат - набор шестнадцатеричных чисел (на всякий случай часть из них - 1a45 dfa3 0100 0000).
Казалось бы, достаточно преобразовать эти символы в VS в двоичный код и результат будет таким же. Только при преобразовании символов в int (и uint32_t) происходят косяки. А именно - уже третий и четвёртый символы, описанной выше последовательности, преобразовываются в отрицательные числа (в случае uint в многозначное положительное), в результате чего и двоичный код выходит неправильный.
Почему так? Как мне получить в VS нормальную последовательность чисел?
Тут результат преобразования этих символов сначала в int, а потом в двоичный код.
После слова Тест идёт два числа - это я перевёл шестнадцатеричные числа, полученные из sublime text, в двоичный код.
Если не считать первые 8 нулей (откуда они могут браться, если в другом редакторе их нет?) в последовательности, полученной в VS, а так же неверно переведённых символов, то числа совпадают.
И вот код, которым открываю файл и провожу преобразование.
setlocale(LC_ALL, "ru");
string path = "video.mkv";
ifstream mkv;
mkv.open(path, fstream::binary);
if (!mkv.is_open())
{
cout << "Not" << endl;
}
else
{
cout << "Success!" << endl;
for (int i = 0; i < 5; i++)
{
char byte;
mkv >> byte;
cout << byte << "\t" << (int)byte << "\t" << bitset<16>((int)byte) << "\t" << i << endl;
}
cout << "Test: " << bitset<16>(0x1a45) << "\t" << bitset<16>(0xdfa3) << endl;