У меня есть вектор целых 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);
простое решение:
ostringstream
или даже sprintf
может помочь), вы получили 2 цифры, диапазон от 0 до F.для каждой шестнадцатеричной цифры вы можете создать битмап следующим образом:
0 = 0000, 1 = 0001, 2 = 0010,..., F = 1111,
добавлять биты в вектор согласно растровому изображению
для восстановления - вы берете 4 бита и переводите его обратно в цифру, затем принимаете 2 цифры и конвертируете обратно в байты (скажем, добавляя 0x к шестнадцатеричному, isringstream
к байту).