C 当没有数据类型可以保存完整数字时,将十六进制转换为十进制

C 当没有数据类型可以保存完整数字时,将十六进制转换为十进制,c,algorithm,bignum,pic,C,Algorithm,Bignum,Pic,我正在使用C语言的PIC微处理器。它是一个16F,所以它不能保存大于32位的整数(unsignedint32是可用的最大数据大小) 我从读卡器收到一个5字节的ID代码。为了传输它,我必须编码成BCD,一个数字一个数字。我无法将其快速转换为字符串,因为它比数据大小大,并且无法处理它。我不能分割它,因为没有为它定义任何操作 我想不出任何可能的解决办法,以前有人处理过吗 编辑: 我以5个字节的顺序接收数字: FF-FF-FF-FF-FF 我需要把它转换成十进制 0123456789012 (13位,十

我正在使用C语言的PIC微处理器。它是一个16F,所以它不能保存大于32位的整数(unsigned
int32
是可用的最大数据大小)

我从读卡器收到一个5字节的ID代码。为了传输它,我必须编码成BCD,一个数字一个数字。我无法将其快速转换为字符串,因为它比数据大小大,并且无法处理它。我不能分割它,因为没有为它定义任何操作

我想不出任何可能的解决办法,以前有人处理过吗

编辑:

我以5个字节的顺序接收数字:

FF-FF-FF-FF-FF

我需要把它转换成十进制

0123456789012


(13位,十进制长度256^5)通过RS232发送。第二个函数(获取ASCII码并发送)我已经让它工作了,但我需要完整数字的字符串表示,然后才能使用它。

您可以自己手动将其“sprint”到字符串。逐个字节检查数据,并通过添加单个字符将其转换为数字字符串。

您可以自己手动将其“sprint”到字符串中。逐字节检查数据,并通过添加单个字符将其转换为数字字符串。

我要做的是对编码为字符串的数字实现加法和乘法(类似于BigNum)。通过这种方式,您可以将ID的最高有效字节快速转换为字符串“a”,将其与字符串“4294967296”(256^4)相乘,得到字符串“B”,将ID的最低有效字节快速转换为另一个字符串“C”,最后加上“B”和“C”


它不是很吸引人,特别是在微控制器上,但它可以工作:)

我要做的是,实现编码为字符串的数字的加法和乘法(有点像BigNum)。通过这种方式,您可以将ID的最高有效字节快速转换为字符串“a”,将其与字符串“4294967296”(256^4)相乘,得到字符串“B”,将ID的最低有效字节快速转换为另一个字符串“C”,最后加上“B”和“C”


它不是很性感,尤其是在微控制器上,但它可以工作:)

这个问题的核心是将“长除法”转换为十进制。和你们小学时学的长除法并不是完全不同的,尽管对于二进制数,长除法要简单得多。但仍然有很多工作要做。 试试看:

您必须实现自己的多字节减法和移位例程。

这个问题的核心是将“长除法”转换为十进制。和你们小学时学的长除法并不是完全不同的,尽管对于二进制数,长除法要简单得多。但仍然有很多工作要做。 试试看:

您必须实现自己的多字节减法和移位例程。

假设您有32位算术:2**24=16777216,因此将x作为最高有效2字节,y作为最低有效3:

  (16777216 * x + y) / 1000 
= (16777000 * x + 216 * x + y) / 1000
= 16777 * x + (216 * x + y) / 1000
第一项可以在32位中计算而不会溢出(因为
x<2**16
)。 第二项也可以在没有溢出的情况下计算(因为
x<2**16
y<2**24

这基本上是一个2位数值的长除法,但在知道除数为1000的情况下预先计算的术语。选择1000是因为它是10的最小幂,大于
2**8

因此,首先计算最低的三位数字,使用
(2**32)%1000==296这一事实。所以这次我们将x作为最高字节,y作为最低4字节

((2**32) * x + y) % 1000 = ((2**32) * x) % 1000 + y % 1000 (modulo 1000)
                         = (296 * x) % 1000 + y % 1000     (modulo 1000)
((2**32) * x + y) % 1000 = ((296 * x) % 1000 + y % 1000) % 1000
然后使用上述公式将原始数字除以1000。然后,您就安全地进入32位区域,可以使用正常循环大量输出剩余的数字


顺便说一句,如果我是你,我会检查结果:我还没有测试过这个,可能是我在什么地方出错了。它应该很容易与在PC上使用64位整数的常用方法进行bcd转换的结果进行比较。

假设您有32位算术:2**24=16777216,那么将x作为最高有效2字节,y作为最低有效3:

  (16777216 * x + y) / 1000 
= (16777000 * x + 216 * x + y) / 1000
= 16777 * x + (216 * x + y) / 1000
第一项可以在32位中计算而不会溢出(因为
x<2**16
)。 第二项也可以在没有溢出的情况下计算(因为
x<2**16
y<2**24

这基本上是一个2位数值的长除法,但在知道除数为1000的情况下预先计算的术语。选择1000是因为它是10的最小幂,大于
2**8

因此,首先计算最低的三位数字,使用
(2**32)%1000==296这一事实。所以这次我们将x作为最高字节,y作为最低4字节

((2**32) * x + y) % 1000 = ((2**32) * x) % 1000 + y % 1000 (modulo 1000)
                         = (296 * x) % 1000 + y % 1000     (modulo 1000)
((2**32) * x + y) % 1000 = ((296 * x) % 1000 + y % 1000) % 1000
然后使用上述公式将原始数字除以1000。然后,您就安全地进入32位区域,可以使用正常循环大量输出剩余的数字


顺便说一句,如果我是你,我会检查结果:我还没有测试过这个,可能是我在什么地方出错了。它应该很容易与在PC上使用64位整数的常用方法进行bcd转换的结果进行比较。

PIC16F没有硬件乘法或除法单元,因此,除非您用2的幂进行乘法或除法运算,否则它会对处理器造成负担。这是一个对32位数字执行BCD的例程,不需要除法或乘法。您可以通过分块执行,将其调整为5字节的数字

无效BCD32(int32u numIn) { int8u数字=0

while (numIn >= 1000000000)
{
    numIn -= 1000000000;
    digit++;
}    
debug[0] = digit + 48;   
digit = 0;
while (numIn >= 100000000)
{
    numIn -= 100000000;
    digit++;
}    
debug[1] = digit + 48;            
digit = 0;
while (numIn >= 10000000)
{
    numIn -= 10000000;
    digit++;
}    
debug[2] = digit + 48;            
digit = 0;
while (numIn >= 1000000)
{
    numIn -= 1000000;
    digit++;
}    
debug[3] = digit + 48;            
digit = 0;
while (numIn >= 100000)
{
    numIn -= 100000;
    digit++;
}    
debug[4] = digit + 48;            
digit = 0;
while (numIn >= 10000)
{
    numIn -= 10000;
    digit++;
}
debug[5] = digit + 48;        
digit = 0;
while (numIn >= 1000)
{
    numIn -= 1000;
    digit++;
}
debug[6] = digit + 48;    
digit = 0;    
while (numIn >= 100)
{
    numIn -= 100;
    digit++;
}
debug[7] = digit + 48;

digit = 0;
while (numIn >= 10)
{
    numIn -= 10;
    digit++;
}
debug[8] = digit + 48;

digit = 0;
while (numIn >= 1)
{
    numIn -= 1;
    digit++;
}
debug[9] = digit + 48;    
debug[10] = CARRIAGE_RETURN;
debug[11] = NEW_LINE_FEED;
SendUart(12);                           

}

PIC16F没有硬件乘法或除法单元,因此,除非您用2的幂进行乘法或除法运算,否则会对处理器造成负担。这是一个对32位数字执行BCD的例程,不需要除法或乘法。您可以通过分块执行,将其调整为5字节的数字

无效BCD32(int32