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

C++ 从8位字节中提取二进制数据并将其转换为基本类型[C+;+;],c++,c,bit-manipulation,data-conversion,C++,C,Bit Manipulation,Data Conversion,我有一个整数向量vector,其中有48项。我想从中提取二进制数据(不确定这是否是正确的调用方法,如果错误,请编辑它),即一个或多个位的序列,然后将其转换为int等基本类型。我提出了以下解决方案: int extractValue(vector<int> v, int startBit, int endBit) { int beginByteIndex = (startBit / 8); int endByteIndex = (endBit / 8); ve

我有一个整数向量
vector
,其中有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;
}
一个简单的解决方案:

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;
}
  • 将每个字节转换为十六进制字符串(
    ostringstream
    或甚至
    sprintf
    都有帮助),您得到了2位数字,范围是0到F
  • 对于每个十六进制数字,您可以创建如下位图:

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

  • 根据位图向向量添加位

  • 要恢复-您需要4位并将其转换回数字,然后需要2位并转换回字节(例如,将0x添加到十六进制,
    isringstream
    到字节)


给出预期输入和输出的示例。用户8个整数而不是48个整数只是为了保存typing@pm100好的,我已经添加了预期的输入和输出示例。请检查。这可能只需使用
std::bitset
std::string
即可完成,并在末尾将字符串转换为int。可能不超过10行代码。顺便说一句,在您的示例中,对于(0,6),0是最左边的位还是最右边的位?也许你应该告诉我们
extractValue
中这两个数字的确切含义。@PaulMcKenzie yes 0是最左边的位。你需要通过
const vector&
而不是
vector
传递向量,或者每次调用
extractValue
都可以复制一份。