4


1

vector <unsigned char>をintに変換する方法は?

バイナリデータで保存された `vector`があります。 vector(2 bytes)から2つのアイテムを取得して、整数に変換する必要があります。 Cスタイルではなく、これをどのように行うことができますか?

6 Answer


6


あなたがすることができます:

vector somevector;
// Suppose it is initialized and big enough to hold a uint16_t

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

// or
int i2 = (static_cast(somevector[0]) << 8) | somevector[1];
// But you must be sure of the byte order as well


6


シフト演算子/ビット単位の操作を使用してください。

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

ここで提案されているキャスト/ユニオンに基づいたソリューションはすべて、未定義の動作であり、http://cellperformance.beyond3d.com/articles/2006/06/understanding-strict-aliasing.html [厳密なエイリアス](例 GCC)。


5


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


4


それを行うもう1つの方法は、memcpyの呼び出しをラップすることです。

#include
using namespace std;

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

int main()
{
  vector 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(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(v,0); //c == 258

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

  return 0;
}

_extract_関数テンプレートは、double、long int、floatなどでも機能します。

この例にはサイズのチェックはありません。 _extract_を呼び出す前に、vには実際に十分な要素があると仮定します。

がんばろう!


3


「Cスタイルではない」とはどういう意味ですか? これを機能させるためにビット単位の操作(シフトおよびors)を使用しても、それが「Cスタイル!」であることを意味するわけではありません。

問題点: `int t = v [0]; t =(t << 8)| v [1]; `?


1


ビッグ/リトルエンディアンを気にしたくない場合は、次を使用できます。

vector somevector;
// Suppose it is initialized and big enough to hold a uint16_t

int i = ntohs(*reinterpret_cast(&somevector[0]));