十进制 转BCD
// @brief double 转换成BCD
// @param buffer
// @param fData 数据
// @param nb_byte 总长度
// @param nb_dec 小数点后位数
uint8_t DecToBcd(uint8_t *buffer, double fData, uint8_t nb_byte, uint8_t nb_dec)
{
char tmp[32] = {0};
char *point = NULL;
if(nb_byte<nb_dec || buffer == NULL)
return 0;
// 保留 nb_dec 位小数并将浮点数转换为字符串
snprintf(tmp, sizeof(tmp), "%.*f", nb_dec, fData);
uint8_t len = strlen(tmp);
// 去除小数点
point = strstr(tmp, ".");
if(point)
memcpy(point, point + 1, &tmp[len] - point);
len = strlen(tmp);
if(len > nb_byte) {
strcpy(tmp, &tmp[len - nb_byte]); /// 保留相应位数
} else if(len < nb_byte){
strcpy(&tmp[nb_byte - len], tmp); // 补 0
memset(tmp, '0', nb_byte - len);
}
len = nb_byte;
// 奇数 前面补 0
if (len % 2) {
strcpy(&tmp[1], tmp);
tmp[0] = '0';
len += 1;
}
// 填充 buffer
uint8_t index = 0;
for (uint8_t i = 0; i < len; i += 2) {
uint8_t digit1 = tmp[i] - '0';
uint8_t digit2 = (i + 1 < len)? (tmp[i + 1] - '0') : 0;
buffer[index++] = (digit1 << 4) | digit2;
}
return index;
}
int main() {
uint8_t buffer[10]={0};
double value = 123.45;
DecToBcd(buffer, value, 7, 2);
for (int i = 0; i < 7; i++) {
printf("%02X ", buffer[i]);
}
printf("\n");
return 0;
}
输出
00 01 23 45 00 00 00