6

実行する必要のある操作では、char配列から1つのint32_t値と2つのint64_t値を取得する必要があります

char配列の最初の4バイトにはint32値が含まれ、次の8バイトには最初のint64_t値が含まれ、次の8バイトには2番目の値が含まれます。これらの値を取得する方法がわかりません。私が試してみました;

int32_t firstValue = (int32_t)charArray[0];
int64_t firstValue = (int64_t)charArray[1];
int64_t firstValue = (int64_t)charArray[3];

int32_t *firstArray = reinterpet_cast<int32_t*>(charArray);
int32_t num = firstArray[0]; 
int64_t *secondArray = reinterpet_cast<int64_t*>(charArray);
int64_t secondNum = secondArray[0];

ストローを掴んでいるだけです。助けていただければ幸いです

4

4 に答える 4

5

迅速で汚い解決策:

int32_t value1 = *(int32_t*)(charArray +  0);
int64_t value2 = *(int64_t*)(charArray +  4);
int64_t value3 = *(int64_t*)(charArray + 12);

これにより、位置合わせされていないメモリ アクセスが発生する可能性があることに注意してください。そのため、常に機能するとは限りません。


厳密なエイリアスに違反せず、アライメントの問題がない、より堅牢なソリューション:

int32_t value1;
int64_t value2;
int64_t value3;

memcpy(&value1,charArray +  0,sizeof(int32_t));
memcpy(&value2,charArray +  4,sizeof(int64_t));
memcpy(&value3,charArray + 12,sizeof(int64_t));
于 2012-07-27T04:37:28.717 に答える
1

アラインメントの問題を回避するための理想的な解決策は、バイトをバッファーからターゲット オブジェクトにコピーすることです。これを行うには、いくつかの便利なユーティリティを使用できます。

typedef unsigned char const* byte_iterator;

template <typename T>
byte_iterator begin_bytes(T& x)
{
    return reinterpret_cast<byte_iterator>(&x);
}

template <typename T>
byte_iterator end_bytes(T& x)
{
    return reinterpret_cast<byte_iterator>(&x + 1);
}

template <typename T>
T safe_reinterpret_as(byte_iterator const it)
{
    T o;
    std::copy(it, it + sizeof(T), ::begin_bytes(o));
    return o;
}

次に、問題はかなり単純です。

int32_t firstValue  = safe_reinterpret_as<int32_t>(charArray);
int64_t secondValue = safe_reinterpret_as<int64_t>(charArray + 4);
int64_t thirdValue  = safe_reinterpret_as<int64_t>(charArray + 12);
于 2012-07-27T04:39:50.740 に答える
1

これを試して

typedef struct {
   int32_t firstValue;
   int64_t secondValue;
   int64_t thirdValue;
} hd;

hd* p = reinterpret_cast<hd*>(charArray);

p->firstValue などの値にアクセスできるようになりました

編集:構造体がバイト境界でパックされていることを確認してください。たとえば、Visual Studio#pragma pack(1)で構造体の前に記述します。

于 2012-07-27T04:37:46.123 に答える
0

ifcharArrayが 1 バイト型の場合、2 番目と 3 番目の値にandcharを使用する必要があります412

于 2012-07-27T04:37:39.803 に答える