【问题标题】:type cast to integer类型转换为整数
【发布时间】:2014-04-11 18:01:45
【问题描述】:

假设我有

    unsigned char * buffer; // buffer len in 10000

我想将 buffer+50 转换为 buffer+54 到 int。以下代码有效

    int c=(*((int *) (buffer+ 32));

但是有没有更好的方法来做到这一点,需要多少指令?

非常感谢。

【问题讨论】:

  • 通过移位操作直接从字节中组装整数。它既有价值又可移植,包括具有 64 位 int 的平台。如前所述,如果您使用的偏移量没有落在正确对齐的内存上,以便您的平台以int 访问(无法承受在 x86 硬件上运行而作弊),那么您将有祸了。而且您最好已经知道入站数据的字节序。
  • 除了@WhozCraig 所说的之外,通过读取每个字符并转换/或转换到您的结果中,您可以精确控制存储的字节顺序,只需编写代码“给我此地址处的整数”您要么依赖主机 CPU 的字节顺序,要么需要知道交换值。
  • 是的,我同意。我知道字节序。我将在相同的字节序和 64 位上运行。我正在研究低延迟项目。如果我忽略字节顺序并使用相同的 CPU,这会起作用吗?

标签: c++ casting char


【解决方案1】:

这样的事情会起作用:

std::uint32_t convert_to_int32(std::uint8_t* buffer) // assume size 4
{
    std::uint32_t result = (static_cast<std::uint32_t>(buffer[0]) << 24) |
                           (static_cast<std::uint32_t>(buffer[1]) << 16) |
                           (static_cast<std::uint32_t>(buffer[2]) << 8) |
                           (static_cast<std::uint32_t>(buffer[3]));
    return result;
}

当前方法的主要问题是如果遇到对齐问题(例如,您尝试从缓冲区中不在整数对齐屏障上的点强制转换整数指针)。 shift 方法解决了这个问题。

【讨论】:

    猜你喜欢
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2020-12-29
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多