有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