如何处理C中的字节序

kir*_*dar 1 c memcpy

我正在尝试使用以下方法将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]);
           }
}
Run Code Online (Sandbox Code Playgroud)

但是当我打印时,它正在复制如下.

buffer: 0, 0x78
buffer: 1, 0x56
buffer: 2, 0x34
buffer: 3, 0x12
Run Code Online (Sandbox Code Playgroud)

我所期待的是.

buffer: 0, 0x12
buffer: 1, 0x34
buffer: 2, 0x56
buffer: 3, 0x78
Run Code Online (Sandbox Code Playgroud)

Lun*_*din 7

uint64_t val = 0x12345678;像任何其他整数一样,在CPU的endianess中表示,在这种情况下显然是小端.研究endianess.

无论CPU如何获得预期结果,您都必须:

uint8_t val[] = {0x12, 0x34, 0x56, 0x78};
Run Code Online (Sandbox Code Playgroud)

另请注意,这0x12345678是一个32位数字,而不是64位.