6

我需要执行的操作需要我从 char 数组中获取一个 int32_t 值和 2 个 int64_t 值

char 数组的前 4 个字节包含 int32 值,接下来的 8 个字节包含第一个 int64_t 值,接下来的 8 个字节包含第二个值。我不知道如何获得这些值。我试过了;

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 struct {
   int32_t firstValue;
   int64_t secondValue;
   int64_t thirdValue;
} hd;

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

现在您可以访问值,例如 p->firstValue

编辑:确保结构被打包在字节边界上,例如使用你#pragma pack(1)在结构之前编写的 Visual Studio

于 2012-07-27T04:37:46.123 回答
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 回答
0

如果charArray是 1 字节char类型,那么您需要使用4and12作为您的第二个和第三个值

于 2012-07-27T04:37:39.803 回答