代码之家  ›  专栏  ›  技术社区  ›  ygoe

将字节数组指针读取为int64\t

  •  1
  • ygoe  · 技术社区  · 4 年前

    在C应用程序(不是C++)中,我有一个通过网络接收的数据字节数组。该数组的长度为9字节。字节1到8(从零开始)表示一个64位整数值,即小端。我的CPU也使用little endian。

    如何将这些字节从数组转换为整数?

    我试过这个:

    uint8_t rx_buffer[2000];
    //recvfrom(sock, rx_buffer, sizeof(rx_buffer) - 1, ...)
    int64_t sender_time_us = *(rx_buffer + 1);
    

    但它给了我89、219、234或27这样的值。发送方将这些值视为1647719702937548、1647719733002117或1647719743790424。(这些例子不匹配,它们只是随机样本。)

    2 回复  |  直到 4 年前
        1
  •  1
  •   ikegami Gilles Quénot    4 年前

    不安全解决方案:

    int64_t sender_time_us = *(int64_t*)(rx_buffer + 1);
    

    这可能是一个对齐冲突,这是一个 strict aliasing rule violation .这是未定义的行为。在某些机器上,这可能会导致程序死机 bus error .


    安全解决方案:

    int64_t sender_time_us;
    memcpy( &sender_time_us, rx_buffer + 1, sizeof( int64_t ) );
    
        2
  •  0
  •   SGeorgiades    4 年前

    你需要投下你的指针,就像这样:

    int64_t sender_time_us = *(int64_t*)(rx_buffer + 1);
    

    事实上,你只得到一个字节的数据。

        3
  •  0
  •   Jim Rhodes    4 年前

    你的代码只有一个 uint8_t .你需要投 int64_t 第一比如:

    int64_t* pBuffer = (int64_t*)(rx_buffer + 1);
    int64_t sender_time_us = *pBuffer;
    

    但您应该知道,一些CPU可能不喜欢访问未对齐的64位值。如果你知道它的持久性,也可以这样做,但实际上最好用一种更便携的方式来处理它。