如何处理C语言中的endianness
我正在尝试使用memcpy将unit64_t数据复制到uint8_t数组,如下所示。 但它是以相反的顺序复制的如何处理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;
#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是一个保留名称。名称与函数的功能完全无关;始终使用自我解释的名称。