C语言编程 8字节的数据转换为uint64_t类型数据

有2种方式可以实现:

第一种方式:

数据类型强制转换,需要注意平台是大端还是小端 ,如果平台是大端,那么字节数组存放的字节顺序是高字节在前;如果平台是小端,那么字节数组存放的字节顺序是低字节在前。

此例程需要在小端模式的平台上运行

/**
  * @brief  None
  * @param  None
  * @retval None
  */
int main( void )
{
    uint8_t ByteDatasLittleEnd[8] = {0x06, 0x4E, 0xE7, 0xDF, 0x72, 0x01, 0x00, 0x00 };

    uint64_t u64Value;

	u64Value = *(uint64_t *)ByteDatasLittleEnd;

	printf("u64Value:%lld\r\n", u64Value );
}

运行结果:
u64Value:1592894377478

第二种方式:

通过移位实现,和平台的大小端无关,如果字节数组里存放的字节顺序是高字节在前,则使用ByteToU64BigEnd()函数;如果字节数组里存放的字节顺序是低字节在前,则使用ByteToU64LittleEnd()函数。

#include "stdint.h"

/**
  * @brief  Little end format.
  * @param  None
  * @retval None
  */
uint64_t ByteToU64LittleEnd( uint8_t *ByteBuf )
{
	uint64_t u64Value = 0;

	for(int8_t i = 7; i >= 0; i--)
	{
		u64Value <<= 8;
		u64Value |= ByteBuf[i];
	}

	return u64Value;
}

/**
  * @brief  Big end format.
  * @param  None
  * @retval None
  */
uint64_t ByteToU64BigEnd( uint8_t *ByteBuf )
{
	uint64_t u64Value = 0;

	for(uint8_t i = 0; i < 8; i++)
	{
		u64Value <<= 8;
		u64Value |= ByteBuf[i];
	}

	return u64Value;
}

/**
  * @brief  None
  * @param  None
  * @retval None
  */
int main( void )
{
    uint8_t ByteDatasBigEnd[8] = {0x00, 0x00, 0x01, 0x72, 0xDF, 0xE7, 0x4E, 0x06 };
    uint8_t ByteDatasLittleEnd[8] = {0x06, 0x4E, 0xE7, 0xDF, 0x72, 0x01, 0x00, 0x00 };

	uint64_t u64Value;

	u64Value = ByteToU64BigEnd( ByteDatas );

	printf("u64Value:%lld\r\n", u64Value );

	u64Value = ByteToU64LittleEnd( ByteDatasLittleEnd );

	printf("u64Value:%lld\r\n", u64Value );
}

运行结果:
u64Value:1592894377478
u64Value:1592894377478

火柴棍科技工作室:www.huochaigun.top

技术交流群

STM32MP1:861926625

ESP8266:476685983

你可能感兴趣的:(C语言编程技巧,c语言,数据结构)