我有一个整数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
)。