fstream — C ++ записывает кусочки в файл

Добрый вечер,
Я новичок в C ++ и столкнулся с проблемой, которую не смог решить, несмотря на то, что читал здесь множество страниц. У меня есть файл с шестнадцатеричными значениями, который нужно прочитать и сжать, а затем записать в новый файл. Примерная последовательность выглядит следующим образом:

C9 CB FF 01 06 (каждый байт [8 бит] представляет число)

Сжатие начинается с первого числа, а затем записывается только различие в следующее число (различия — полубайты [4 бита]). Пример от C9 до CB: разность = 2. Если разница больше 7, поэтому не может быть представлена ​​полубайтом, мы используем 0x8, чтобы отметить новый старт. 0xFF-0xCB> 7, поэтому последовательность будет выглядеть так (весь сжатый код):

C9 28 FF 15 (смесь целых байтов (0xC9 и 0xFF), представляющих числа и полубайты, представляющие различия для следующего числа. Теперь моя проблема. Я использую fstream и помещаю, чтобы записать байты в новый файл, полубайты сохраняются для объединения с другим кусочком байта, который может быть записан в файл. Однако он работает только с байтами, меньшими 128, поэтому я не могу записать в файл значения больше 0x7F. Я подготовил файл с notepad ++, начиная со значения 0xFF — чтение этого значения прекрасно работает, но dest.put(source.get()); не в этом конкретном случае. Как я могу работать с (подписанными) полубайтами [для отрицательных отличий] и двоичными представлениями чисел в C ++? Кстати, использование отрицательных чисел в file.put () приводит к странному поведению, так как записано 2 байта, а не один. Вот мой код, я надеюсь, вы понимаете мою проблему, и я очень ценю вашу помощь

int lastValue = s.get();
d.put((char)lastValue);
char highNibble = 0;
bool nibbleSet = false;
int diff = 0;
for (int c = s.get(); c != -1; c = s.get()) {
diff = (char)((unsigned char)c - (unsigned char)lastValue);
if (abs(diff) > 7) {
if (nibbleSet) {
d.put(highNibble << 4 | 8);
d.put((char)c);
nibbleSet = false;
}
else {
cout << (8 << 4 | (c & 0xF0) >> 4) << endl;
d.put(8 << 4 | (c & 0xF0) >> 4);
highNibble = c & 0x0F;
nibbleSet = true;
}
}
else {
if (nibbleSet) {
d.put(((char)highNibble << 4) & 0xF0 | ((char)diff) & 0x0F);
nibbleSet = false;
}
else {
highNibble = (char)diff;
nibbleSet = true;
}
}
lastValue = c;
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]