/**
* 将一个十六进制数转换为两个十进制数
* @param hex 要转换的十六进制数
* @param dec 存储转换结果的unsigned char数组,长度为2
*/
void Hex2ToDec2(uint16_t hex, uint8_t *dec)
{
// 对十六进制数进行限制,最大为9999
hex %= 0x2710;
// 初始化十进制数
dec[0] = 0x00;
dec[1] = 0x00;
// 将千位和百位放入dec[0]
dec[0] = (hex / 1000) << 4; // 左移4位,将千位放到高4位
dec[0] |= hex % 1000 / 100; // 合并百位,放到低4位
// 将十位和个位放入dec[1]
dec[1] = (hex % 1000 % 100 / 10) << 4; // 左移4位,将十位放到高4位
dec[1] |= hex % 10; // 合并个位,放到低4位
}
这段代码用于将一个16位的十六进制数转换为两个字节的十进制表示。主要步骤如下:
-
由于两个字节的最大值为9999(0x2710),对超过此值的部分进行了截断(即取模运算hex %= 0x2710),确保结果在合理范围内。
-
初始化结果数组dec的首字节和尾字节为0。
-
计算千位数字:将hex除以1000得到千位数字的值,然后将结果左移4位(即乘以16),并将结果赋给dec的首字节(dec[0])。
-
计算百位数字:将hex对1000取模,再除以100,得到百位数字的值,然后将结果赋给dec的首字节(dec[0])。
-
计算十位数字:将hex对1000取模,再对100取模,得到十位数字的值,然后将结果左移4位,将结果赋给dec的尾字节(dec[1])。
-
计算个位数字:将hex对1000取模,再对100取模,再对10取模,得到个位数字的值,然后将结果赋给dec的尾字节(dec[1])。
这样,最终结果即为将十六进制数转换为两个字节的十进制表示,存储在dec数组中。
int DectoHex(int dec, unsigned char *hex, int length)
/**
* 将十进制数转换为指定长度的十六进制表示
* @param dec 十进制数
* @param hex 存储转换结果的unsigned char数组
* @param length 要转换成的十六进制数的长度
* @return 转换成功返回0
*/
int DectoHex(int dec, unsigned char *hex, int length)
{
int i;
for (i = length-1; i >= 0; i--)
{
hex[i] = (dec % 256) & 0xFF; // 取十六进制位的值并截断
dec /= 256; // 除以256,准备下一位的计算
}
return 0;
}
当调用这个函数进行转换时,我们举一个例子来说明:
假设我们要将十进制数123456转换为6位长度的十六进制表示,存储在长度为6的unsigned char数组hex中。
调用的代码如下:
int dec = 123456;
unsigned char hex[6];
int length = 6;
DectoHex(dec, hex, length);
在函数内部的循环中,迭代6次,依次计算每个十六进制位的值。
第一次循环:
- dec % 256 = 123456 % 256 = 64
- hex[5] = 64 & 0xFF = 0x40
第二次循环:
- dec /= 256 = 123456 / 256 = 482
- dec % 256 = 482 % 256 = 226
- hex[4] = 226 & 0xFF = 0xE2
依此类推,执行完全部6次循环后,数组hex中存储的十六进制值为:
hex = { 0x00, 0x00, 0x00, 0x01, 0xE2, 0x40 }
这样,我们成功将十进制数123456转换为6位长度的十六进制表示。