5

我已经vector<unsigned char>提交了二进制数据。我需要从向量(2 个字节)中取出 2 个项目并将其转换为整数。这怎么能不以 C 风格完成?

4

6 回答 6

7

请使用移位运算符/按位运算。

int t = (v[0] << 8) | v[1];

这里提出的所有基于强制转换/联合的解决方案都是 AFAIK 未定义的行为,并且可能在利用严格别名的编译器(例如 GCC)上失败。

于 2010-10-27T10:13:56.683 回答
6

你可以这样做:

vector<unsigned char> somevector;
// Suppose it is initialized and big enough to hold a uint16_t

int i = *reinterpret_cast<const uint16_t*>(&somevector[0]);
// But you must be sure of the byte order

// or
int i2 = (static_cast<int>(somevector[0]) << 8) | somevector[1];
// But you must be sure of the byte order as well
于 2010-10-27T09:06:07.520 回答
5

v[0]*0x100+v[1]

于 2010-10-27T09:04:10.120 回答
4

好吧,另一种方法是包装对 memcpy 的调用:

#include <vector>
using namespace std;

template <typename T>
T extract(const vector<unsigned char> &v, int pos)
{
  T value;
  memcpy(&value, &v[pos], sizeof(T));
  return value;
}

int main()
{
  vector<unsigned char> v;
  //Simulate that we have read a binary file.
  //Add some binary data to v.
  v.push_back(2);
  v.push_back(1);
  //00000001 00000010 == 258

  int a = extract<__int16>(v,0); //a==258
  int b = extract<short>(v,0); //b==258

  //add 2 more to simulate extraction of a 4 byte int.
  v.push_back(0);
  v.push_back(0);
  int c = extract<int>(v,0); //c == 258

  //Get the last two elements.
  int d = extract<short>(v,2); // d==0

  return 0;
}

extract函数模板也适用于double、long int、float 等。

此示例中没有大小检查。我们假设 v 在每次调用extract之前实际上有足够的元素。

祝你好运!

于 2011-10-25T21:01:42.090 回答
3

你是什​​么意思“不是C风格”?使用按位运算(移位和或)来使其工作并不意味着它是“C 风格!”

有什么问题:int t = v[0]; t = (t << 8) | v[1];

于 2010-10-27T09:08:18.557 回答
1

如果您不想关心大/小端,您可以使用:

vector<unsigned char> somevector;
// Suppose it is initialized and big enough to hold a uint16_t

int i = ntohs(*reinterpret_cast<const uint16_t*>(&somevector[0]));
于 2010-10-27T09:21:54.750 回答