我需要执行的操作要求我从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];
我只是抓住吸管。任何帮助表示赞赏
答案 0 :(得分: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));
答案 1 :(得分:1)
试试这个
typedef struct {
int32_t firstValue;
int64_t secondValue;
int64_t thirdValue;
} hd;
hd* p = reinterpret_cast<hd*>(charArray);
现在您可以访问这些值,例如对 - &GT; firstValue
编辑:确保结构在字节边界上打包,例如使用Visual Studio,在结构
之前编写#pragma pack(1)
答案 2 :(得分: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);
答案 3 :(得分:0)
如果charArray
是1字节char
类型,那么您需要使用4
和12
作为第2和第3个值