我正在尝试将char数组转换为整数:
const int LENGTH = 3 * sizeof(int);
char data[LENGTH];
/* data is filled */
for (int i = 0; i < LENGTH; i += sizeof(int)) {
std::cout << "Integer: " << (int)data[i] << std::endl;
}
for (int i = 0; i < LENGTH; i += sizeof(short)) {
std::cout << (short)data[i] << " ";
}
输出是:
Integer: 0
Integer: 0
Integer: 0
0 3 0 3 0 3
我希望如果短路不是零,那么整数也必须如此。可能看到here的转换仅适用于那个字符/字节,而不适用于下面的4个字节。我该如何解决这个问题?
要明确:我希望将字节0到3转换为一个整数,然后将下一个(4到7)转换为下一个整数,依此类推......
答案 0 :(得分:0)
正如@underscore_d所指出的,此answer中的*((int*)&data[i])
会导致未定义的行为,并且应使用memcpy
。
int intData[3];
std::memcpy(intData, data, sizeof data);
for (int i = 0; i < 3; i++) {
std::cout << "int: " << intData[i] << " ";
}
工作正常,符合reference of memcpy。
答案 1 :(得分:0)
您正在向data[i]
投射int
。但是,data[i]
是char
,所以你可以施放你想要的一切,演员不会神奇地读取额外的字节。相反,您必须将data
指针强制转换为int *
,然后才取消引用它。
基本上,你最终会得到这样的东西:
auto voidPtr = static_cast<void const *>(data);
auto intPtr = static_cast<int const *>(voidPtr);
for (size_t i = 0; i < LENGTH / sizeof(int); ++i) {
std::cout << "Int: " << intPtr[i] << "\n";
}
注意i
每次仅增加1,但增量数除以sizeof(int)
。这是因为当您对int *
建立索引时,编译器会自动执行正确的操作。
另外请注意,您回来的可能不是您所期望的。取决于您运行此机器的机器是大端还是小端。
P.S。:一般不鼓励使用C风格的演员表,static_cast<int>
更明确地表达你想要达到的目标。