/**********************************************************************
* COPYRIGHT NOTICE - XXX、 TECHNOLOGY
*
* Copyright (c) 2018, XXX Technology, Inc.
*
* All rights reserved.
*
*======================================================================
* \file convertor.c
* \brief TODO
* \author Joker
* \
* \version 1.0.0
* \date 2018年6月12日 下午12:35:41
*---------------------------------------------------------------------
* Remark: This project is still under construction.
*======================================================================
* Change History:
*---------------------------------------------------------------------
* <Date> | <Version> | <Author> | <Description>
*---------------------------------------------------------------------
* 2018年6月12日 | V1.0.0 | Joker | Create file
*======================================================================
* Detailed Notes:
*---------------------------------------------------------------------
* <Version> | <Description>
*---------------------------------------------------------------------
* V1.0.0 | TODO
*---------------------------------------------------------------------
**********************************************************************/
#include "Utils/Inc/convertor.h"
#include <stddef.h>
static ConvertorEndiannessTypeDef g_s_endian = CONVERTOR_ENDIAN_LITTLE;
static char chartolower(char c);
/**
* @brief 将大写字母转化为小写字母
* @param[in] c 字符
* @note
* @see
* @code
*
* @retval 返回转换结果
*/
static char chartolower(char c)
{
if (c >= 'A' && c <= 'Z')
{
return c + 'a' - 'A';
}
else
{
return c;
}
}
/**
* @brief 自动搜索字符串,将十六进制字符串转化为整数
* @param[in] s 字符串数组
* @param[out] error 如果此变量为非NULL值,则转换出错,就会将其指向错误的字符串,否则指向NULL
* @note error指针无需分配内存空间,该函数只能转换第一个十六进制字符串,无法将数组内的所有字符串转换
* @see
* @code
*
* @retval 返回转换结果
*/
uint8_t ConvertorHexStringToU8(char s[], char **error)
{
static char *error_format = "Invalid format";
bool is_ok = false;
uint8_t i;
uint8_t n = 0;
*error = NULL;
if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
{
i = 2;
}
else
{
i = 0;
}
for (; (s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'f') || (s[i] >= 'A' && s[i] <= 'F'); i++)
{
if (chartolower(s[i]) > '9')
{
n = 16 * n + (10 + chartolower(s[i]) - 'a');
is_ok = true;
}
else
{
n = 16 * n + (chartolower(s[i]) - '0');
is_ok = true;
}
}
if (!is_ok)
*error = error_format;
return n;
}
/**
* @brief 将字节数组转化为32bit无符号整形
* @param[in] src 存放数据字节的数组
* @note 字节序:
* @see
* @code
* @retval 转化结果
*/
uint32_t ConvertorBytesToU32(uint8_t *src)
{
uint32_t t = 0;
if(g_s_endian == CONVERTOR_ENDIAN_LITTLE)
{
t += src[3]<<24;
t += src[2]<<16;
t += src[1]<<8;
t += src[0];
}
else
{
t += src[0]<<24;
t += src[1]<<16;
t += src[2]<<8;
t += src[3];
}
return t;
}
/**
* @brief 将字节数组转化为16bit无符号整形
* @param[in] src 存放数据字节的数组
* @note 字节序:低字节放低地址
* @see
* @code
* @retval 转化结果
*/
uint16_t ConvertorBytesToU16(uint8_t *src)
{
uint16_t t = 0;
if(g_s_endian == CONVERTOR_ENDIAN_LITTLE)
{
t += src[1]<<8;
t += src[0];
}
else
{
t += src[0]<<8;
t += src[1];
}
return t;
}
/**
* @brief 将字节数组转化为64bit无符号整形
* @param[in] src 存放数据字节的数组
* @note 字节序:低字节放低地址
* @see
* @code
* @retval 转化结果
*/
uint64_t ConvertorBytesToU64(uint8_t *src)
{
uint64_t t = 0;
if(g_s_endian == CONVERTOR_ENDIAN_LITTLE)
{
t += ((uint64_t)src[7] << 56);
t += ((uint64_t)src[6] << 48);
t += ((uint64_t)src[5] << 40);
t += ((uint64_t)src[4] << 32);
t += ((uint64_t)src[3] << 24);
t += ((uint64_t)src[2] << 16);
t += ((uint64_t)src[1] << 8);
t += ((uint64_t)src[0] << 0);
}
else
{
t += ((uint64_t)src[0] << 56);
t += ((uint64_t)src[1] << 48);
t += ((uint64_t)src[2] << 40);
t += ((uint64_t)src[3] << 32);
t += ((uint64_t)src[4] << 24);
t += ((uint64_t)src[5] << 16);
t += ((uint64_t)src[6] << 8);
t += ((uint64_t)src[7] << 0);
}
return t;
}
/**
* @brief 将32bit无符号整数转化为字节数组
* @param[in] data 要转化的数据
* @param[out] dest 存放转化结果的数组
* @note 字节序:低字节放低地址
* @see
* @code
* @retval None
*/
void ConvertorU32ToBytes(uint32_t data, uint8_t *dest)
{
if(g_s_endian == CONVERTOR_ENDIAN_LITTLE)
{
dest[3] = data >> 24;
dest[2] = data >> 16;
dest[1] = data >> 8;
dest[0] = data;
}
else
{
dest[0] = data >> 24;
dest[1] = data >> 16;
dest[2] = data >> 8;
dest[3] = data;
}
}
/**
* @brief 将64bit无符号整数转化为字节数组
* @param[in] data 要转化的数据
* @param[out] dest 存放转化结果的数组
* @note 字节序:低字节放低地址
* @see
* @code
* @retval None
*/
void ConvertorU64ToBytes(uint64_t data, uint8_t *dest)
{
if(g_s_endian == CONVERTOR_ENDIAN_LITTLE)
{
dest[7] = data >> 56;
dest[6] = data >> 48;
dest[5] = data >> 40;
dest[4] = data >> 32;
dest[3] = data >> 24;
dest[2] = data >> 16;
dest[1] = data >> 8;
dest[0] = data;
}
else
{
dest[0] = data >> 56;
dest[1] = data >> 48;
dest[2] = data >> 40;
dest[3] = data >> 32;
dest[4] = data >> 24;
dest[5] = data >> 16;
dest[6] = data >> 8;
dest[7] = data;
}
}
/**
* @brief 将16bit无符号整数转化为字节数组
* @param[in] data 要转化的数据
* @param[out] dest 存放转化结果的数组
* @note 字节序:低字节放低地址
* @see
* @code
* @retval None
*/
void ConvertorU16ToBytes(uint16_t data, uint8_t *dest)
{
if(g_s_endian == CONVERTOR_ENDIAN_LITTLE)
{
dest[1] = data >> 8;
dest[0] = data;
}
else
{
dest[0] = data >> 8;
dest[1] = data;
}
}
/**
* @brief 将32bit浮点数转化为字节数组, 数值放大1000倍
* @param[in] data 要转化的数据
* @param[out] dest 存放转化结果的数组
* @note 字节序:低字节放低地址
* @see
* @code
* @retval None
*/
void ConvertorFloat32ToBytes(float32_t data, uint8_t *dest)
{
if(g_s_endian == CONVERTOR_ENDIAN_LITTLE)
{
dest[3] = ((int32_t)(data * 1000)) >> 24;
dest[2] = ((int32_t)(data * 1000)) >> 16;
dest[1] = ((int32_t)(data * 1000)) >> 8;
dest[0] = ((int32_t)(data * 1000));
}
else
{
dest[0] = ((int32_t)(data * 1000)) >> 24;
dest[1] = ((int32_t)(data * 1000)) >> 16;
dest[2] = ((int32_t)(data * 1000)) >> 8;
dest[3] = ((int32_t)(data * 1000));
}
}
/**
* @brief 将字节数组转化为32bit浮点数,字节数组的数字为原始值放大1000倍
* @param[in] src 存放数据字节的数组
* @note 字节序:低字节放低地址
* @see
* @code
* @retval 转化结果
*/
float32_t ConvertorBytesToFloat32(uint8_t *src)
{
int32_t t = 0;
if(g_s_endian == CONVERTOR_ENDIAN_LITTLE)
{
t += src[3]<<24;
t += src[2]<<16;
t += src[1]<<8;
t += src[0];
}
else
{
t += src[0]<<24;
t += src[1]<<16;
t += src[2]<<8;
t += src[3];
}
return t / 1000.0f;
}
ConvertorEndiannessTypeDef ConvertorGetEndianness(void)
{
return g_s_endian;
}
void ConvertorSetEndianness(ConvertorEndiannessTypeDef type)
{
g_s_endian = type;
}
没有合适的资源?快使用搜索试试~ 我知道了~
atan2查表算法、linux内核kfifo脱离平台实现、crc校验算法、数值序列化等通用库
共12个文件
h:7个
c:5个
需积分: 10 24 下载量 110 浏览量
2019-05-27
11:25:40
上传
评论 1
收藏 15KB ZIP 举报
温馨提示
该工具库代码符合MISRA-C2004规范,特别适用于资源紧张、无FPU的嵌入式平台,实现效率高,接口定义清晰,注释清晰,是可通用的工具库,包括如下: 1、atan2_tab.h atan2的查表法实现 2、convertor.h 支持整数、浮点与字节数组的互相转换,支持大小端设定 3、crc.h 包含crc16-ccitt和crc32的算法实现 4、fifo.h 参考linux kernel的kfifo的实现,无锁读写,效率高 5、math_fast.h 开根号sqrt的快速算法实现
资源推荐
资源详情
资源评论
收起资源包目录
Utils.zip (12个子文件)
Utils
Inc
fifo.h 2KB
math_fast.h 2KB
convertor.h 2KB
type_def.h 2KB
atan2_tab.h 1014B
crc.h 1KB
Src
math_fast.c 3KB
crc.c 8KB
convertor.c 8KB
fifo.c 6KB
atan2_tab.c 4KB
utils.h 2KB
共 12 条
- 1
资源评论
ssss23243
- 粉丝: 6
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功