извлечение двоичных данных из 8-битного байта и преобразование их в примитивные типы [C ++]

0

У меня есть вектор целых vector<int> который содержит 48 элементов. Я хочу извлечь из него двоичные данные (не уверенный, что это правильный способ вызвать его, отредактируйте его, если это неправильно), то есть последовательность из одного или нескольких битов, а затем преобразуйте их в примитивный тип типа int. Я придумал это решение:

int extractValue(vector<int> v, int startBit, int endBit) {
    int beginByteIndex = (startBit / 8);
    int endByteIndex = (endBit / 8);

    vector<bool> bits;
    bits.clear();

    int startIndex = startBit % 8;
    int endIndex = endBit % 8;
    int value = v[beginByteIndex];
    value = (value << startIndex);
    int temp = 8;
    if (beginByteIndex == endByteIndex) {
        temp = endIndex + 1;
    }
    for (int i = startIndex; i < temp; i++) {
        int temp = 0x80 & value;
        bits.push_back(temp);
        value <<= 1;
    }

    for (int i = beginByteIndex + 1; i < endByteIndex; i++) {
        value = v[i];
        for (int j = 0; j < 8; j++) {
            int temp = 0x80 & value;
            bits.push_back(temp);
            value <<= 1;
        }
    }

    if (endByteIndex > beginByteIndex) {
        value = v[endByteIndex];
        for (int i = 0; i <= endIndex; i++) {
            int temp = 0x80 & value;
            bits.push_back(temp);
            value <<= 1;
        }
    }

    int size = bits.size();
    int p = 1;
    int result = 0;
    for (int i = size - 1; i >= 0; i--) {
        result += (bits[i] * p);
        p *= 2;
    }

    return result;
}

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

РЕДАКТИРОВАТЬ:

как запрошено в комментариях, например, я хочу извлечь следующую информацию со следующими позициями и длиной:

int year = extractValue(data, 0, 6);
int month = extractValue(data, 7, 10);
int day = extractValue(data, 11, 15);
  • 1
    приведите пример ожидаемого ввода и вывода. Пользователь 8 дюймов вместо 48 просто чтобы сохранить набор текста
  • 0
    @ pm100 Хорошо, я добавил ожидаемый пример ввода и вывода. пожалуйста, проверьте.
Показать ещё 4 комментария
Теги:
bit-manipulation
data-conversion

1 ответ

0

простое решение:

  • конвертировать каждый байт в шестнадцатеричную строку (ostringstream или даже sprintf может помочь), вы получили 2 цифры, диапазон от 0 до F.
  • для каждой шестнадцатеричной цифры вы можете создать битмап следующим образом:

    0 = 0000, 1 = 0001, 2 = 0010,..., F = 1111,

  • добавлять биты в вектор согласно растровому изображению

  • для восстановления - вы берете 4 бита и переводите его обратно в цифру, затем принимаете 2 цифры и конвертируете обратно в байты (скажем, добавляя 0x к шестнадцатеричному, isringstream к байту).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню