如何处理C语言中的endianness

如何处理C语言中的endianness,c,memcpy,C,Memcpy,我正在尝试使用memcpy将unit64_t数据复制到uint8_t数组,如下所示。 但它是以相反的顺序复制的 #include<stdlib.h> #include<stdint.h> #include<stdio.h> #include<inttypes.h> void create(uint8_t * pu8Data, uint64_t Val) { uint8_t *tempBuffer = pu8Data;

我正在尝试使用memcpy将unit64_t数据复制到uint8_t数组,如下所示。 但它是以相反的顺序复制的

#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, 0x12
buffer: 1, 0x34
buffer: 2, 0x56
buffer: 3, 0x78
uint64_t val=0x12345678;与任何其他整数一样,它以CPU的尾数表示,在本例中,显然是小尾数。学习持久性

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

uint8_t val[] = {0x12, 0x34, 0x56, 0x78};
另外请注意,0x12345678是一个32位数字,而不是64位。

uint64\u t val=0x12345678;与任何其他整数一样,它以CPU的尾数表示,在本例中,显然是小尾数。学习持久性

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

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

另外请注意,0x12345678是一个32位的数字,而不是64位。

您假设的是endianess。这不是可移植代码的方法。为序列化数据定义适当的格式,并使用适当的序列化函数。旁注:在POSIX上,create是一个保留名称。名称与函数的功能完全无关;总是使用不言自明的名字。你是在假设词尾。这不是可移植代码的方法。为序列化数据定义适当的格式,并使用适当的序列化函数。旁注:在POSIX上,create是一个保留名称。名称与函数的功能完全无关;始终使用自我解释的名称。