代码之家  ›  专栏  ›  技术社区  ›  kiran Biradar

如何处理C语言中的endianness

  •  1
  • kiran Biradar  · 技术社区  · 6 年前

    我想复制 unit64_t 数据到 uint8_t 数组使用 memcpy 但它是按相反的顺序复制的。

    #include<stdlib.h>
    #include<stdint.h>
    #include<stdio.h>
    #include<inttypes.h>
    void create(uint8_t * pu8Data, uint64_t Val)
    {
            uint8_t *tempBuffer = pu8Data;
    
            if( NULL != tempBuffer )
            {
                    memcpy(tempBuffer,(const void *)&Val,8);
            }
    }
    
    int main()
    {
            uint8_t *p = malloc(sizeof(uint8_t)*80);
            uint64_t val = 0x12345678;
            create(p,val);
            int i =0;
            for ( i = 0; i < 4; i++) {
                  printf("buffer: %d, 0x%02X\n", i, p[i]);
               }
    }
    

    但当我打印时,它是像下面这样复制的。

    buffer: 0, 0x78
    buffer: 1, 0x56
    buffer: 2, 0x34
    buffer: 3, 0x12
    

    我所期待的是。

    buffer: 0, 0x12
    buffer: 1, 0x34
    buffer: 2, 0x56
    buffer: 3, 0x78
    
    1 回复  |  直到 6 年前
        1
  •  7
  •   Lundin    6 年前

    uint64_t val = 0x12345678; 和其他整数一样,它是用CPU的endianess表示的,在本例中显然是小endian。学习环境。

    要获得预期的结果而不考虑CPU,您必须执行以下操作:

    uint8_t val[] = {0x12, 0x34, 0x56, 0x78};
    

    0x12345678 是32位数字,而不是64位。