【问题标题】:c++ how to cast multiple bytes from char[] into one integerc ++如何将char []中的多个字节转换为一个整数
【发布时间】:2017-12-14 15:24:17
【问题描述】:

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

【问题讨论】:

  • /* data is filled */ 在哪里?如何?用什么?
  • 整数通过网络连接从 android 发送,但这不应该有所作为,因为短裤证明数据 [] 中有一些数据。
  • 您可以将 char 转换为 int,这很容易,但是,您希望如何将 char 转换为 int?将 char 值加在一起形成一个 int?或者将 int bits = 设置为 3 char 位(会导致与添加字符不同的值)?
  • @peti446 对于他们想要做的事情,这只是一个简单的算术提升,保持相同的值但扩大了类型。然而,似乎他们真正想要的是通过指针重新解释,所以使用指针转换而不是算术转换。

标签: c++ type-conversion


【解决方案1】:

您将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&lt;int&gt; 更明确地显示了您想要实现的目标。

【讨论】:

    【解决方案2】:

    正如@underscore_d 所指出的,来自这个answer*((int*)&amp;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

    【讨论】:

    • 这违反了别名规则,因此您的程序具有未定义的行为。理想情况下,您将改为声明一个目标类型数组int,然后将memcpy() 来自网络的字节添加到该数组中。因此,当您最终将它们读为int 时,那里确实存在一个int,而不仅仅是您希望编译器将其视为ints 的一些chars。正如 Darhuuk 所说,这假设您将有正确的字节顺序来这样做;如果你不这样做,那么你需要手动阅读和转换。
    • @underscore_d 感谢您指出这是未定义的行为!我使用std::memcpy 将数据从char[] 复制到int[]。这是来自memcpy-reference 的实际示例。
    猜你喜欢
    • 1970-01-01
    • 2021-04-17
    • 2021-03-14
    • 1970-01-01
    • 2015-01-16
    • 2023-03-09
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    相关资源
    最近更新 更多