从8位字节中提取二进制数据并将其转换为基本类型[C ++]

时间:2014-08-13 23:55:50

标签: c++ c bit-manipulation data-conversion

我有一个整数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 个答案:

答案 0 :(得分:0)

一个简单的解决方案:

  • 将每个字节转换为十六进制字符串(ostringstream甚至sprintf可以提供帮助),您有2位数,范围是0到F.
  • 对于每个十六进制数字,您可以像这样创建位图:

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

  • 根据位图

  • 向矢量添加位
  • 恢复 - 你取4位并将其转换回数字,然后取2位数并转换回字节(比如通过向十六进制加{,isringstream到字节)。