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 ответов

Другие вопросы по тегам