5

バイナリデータをvector<unsigned char>提出しました。たとえば、vector(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

それを行うもう1つの方法は、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;
}

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

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

幸運を!

于 2011-10-25T21:01:42.090 に答える
3

「Cスタイルではない」とはどういう意味ですか?これを機能させるためにビット演算(シフトおよびOR)を使用しても、それが「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 に答える