c ++如何将char []中的多个字节转换为一个整数

时间:2017-12-14 15:24:18

标签: c++ type-conversion

我正在尝试将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)转换为下一个整数,依此类推......

2 个答案:

答案 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>更明确地表达你想要达到的目标。