如何处理 C 中的字节顺序
How to handle endianness in C
我正在尝试使用 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, 0x78
buffer: 1, 0x56
buffer: 2, 0x34
buffer: 3, 0x12
我期待的是。
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 位数字。
我正在尝试使用 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, 0x78
buffer: 1, 0x56
buffer: 2, 0x34
buffer: 3, 0x12
我期待的是。
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 位数字。