gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:30:05 26 4
gpt4 key购买 nike

我有一个整数 vector 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,

  • 根据位图向 vector 添加位

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

关于c++ - 从 8 位字节中提取二进制数据并将其转换为原始类型 [C++],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25298046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com