【问题标题】:Extract chars from array as UINT32从数组中提取字符为 UINT32
【发布时间】:2014-12-10 17:42:41
【问题描述】:

所以我有一个充满字节的缓冲区,我知道应该至少有 16 个字节长。 我不关心字节 0 - 11。 我知道12到15这4个字节代表一个32位的数字。

我怎样才能提取这些字节并将它们表示为 32 位数字。

【问题讨论】:

    标签: c arrays data-conversion


    【解决方案1】:

    您可以将每个字节转换为一个 8 位无符号数,并且您可以使用位运算将这些数字组合为一个 32 位数:

    uint32_t result = 0;
    
    for (int i = 12; i < 16; i++) {
        result <<= 8;
        result |= (uint8_t)bytes[i];
    }
    

    【讨论】:

    • 我知道值应该是 191。但是这个方法给了我 808469062
    • @dubbeat 可能是字节序问题? (即,您应该从字节四重组的另一端开始。)(顺便说一句,191 非常适合 unsigned char ——您真的需要 4 个字节吗?您是否检查了缓冲区的实际内容,例如使用调试器还是逐字节打印?)
    【解决方案2】:

    我对@9​​87654321@ 着迷,我情不自禁。这可能会有所帮助:

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdint.h>
    #include <string.h>
    #include <arpa/inet.h>
    
    uint32_t
    convert_int(char bytes[4])
    {
            union {uint32_t n; char bytes[4];} box;
    
            memcpy(&box.bytes[0], bytes, sizeof(*bytes));
            return ntohl(box.n);
    }
    
    int
    main(void)
    {
    
            uint32_t number;
    
            number = convert_int("\x0A\x00\x00\x00");
            printf("%d\n", number);
            return 0;
    }
    

    convert_int() 接受网络字节顺序中的 4 个字节(大端)(最高有效字节在前)并将其转换为 32 位整数;主机字节顺序(大端或小端)。由于您可以控制缓冲区,因此您可以根据需要放置参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 2013-06-16
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      相关资源
      最近更新 更多