C++ 如何将 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

我希望如果短裤不为零,整数也必须为零。可能这里看到的转换只适用于那一个字符/字节,而不是预期的 4 个字节。我该如何解决这个问题?

需要明确的是:我希望将字节 0 到 3 转换为一个整数,然后将下一个(4 到 7)转换为下一个整数,依此类推......

您正在将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 *编制索引时,编译器将自动执行正确的操作。

还要注意,你得到的可能不是你所期望的。取决于您运行此任务的计算机是大端还是小端。

PS:通常不鼓励使用C型转换,static_cast<int>更明确地显示你想要实现的目标。

正如@underscore_d指出的,这个答案*((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] << "   ";
}

工作正常,符合MEMCPY的参考。

最新更新