📄 tools.c
字号:
// 一些转换函数
/*判断是否数字型ASCII码串 1===不是 0===是*/
uchar NotNAsc(uchar *sour,uchar len){
uchar tmp,i;
for(i=0;i<len;i++) {
tmp=*(sour+i);
if((tmp>0x39)||(tmp<0x30))
return 1;
}
return 0;
}
//求10的times次方,返回为计算结果
unsigned long timesof10(int times){
int i;
unsigned long result=1;
for(i=0;i<times;i++)
result=result*10;
return result;
}
/*判断是否BCD码串 1===不是 0===是*/
uchar NotBcd(uchar *sour,uchar len){
uchar tmp,i;
for(i=0;i<len;i++){
tmp=*(sour+i);
tmp=(tmp>>4)&0x0f;
if((tmp<0)||(tmp>9))
return 1;
tmp=*(sour+i);
tmp=tmp&0x0f;
if((tmp<0)||(tmp>9))
return 1;
}
return 0;
}
//将一BCD码型的串转为LONG型数值,
//参数如下:num_uchars ----BCD码型的串长 sour----指向字串
//规则:if (sour=99,99,99) then result=999999;
//返回:LONG型数值
unsigned long bcd_to_long(uchar num_uchars,uchar *sour){
unsigned long result1 = 0;
uchar tmp;
uchar i;
if(NotBcd(sour,num_uchars))
return 0;
for(i = num_uchars;i > 0;i--){
tmp = *(sour+num_uchars-i);
result1 += (tmp>>4)*timesof10(2*i-1);
result1 += (tmp&0x0f)*timesof10(2*i-2);
}
return result1;
}
//转换结果---右对齐,左补零 num_uchars---BCD字节数
//例:if sour=9999;nums=4;then dest=0x00,0x00,0x99,0x99;
void long_to_bcd(long sour,uchar num_uchars,uchar *dest){
unsigned char a;
memset(dest,0,num_uchars);
dest += num_uchars-1;
while(num_uchars-- > 0){
a = (sour % 10);
sour /= 10;
*dest = ((sour % 10)<<4) + a;
dest--;
sour /= 10;
}
}
/*将LONG型金额转为一带有'。'分隔的通常金额表示方式 其中:DEST的第一个字节为转后的字串长度;
strlen(dest)>=13
if sour=99; then dest=0x04,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,'.',0x39,0x39;
if sour=9999; then dest=0x05,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x39,0x39,'.',0x39,0x39;
*/
int amount_conv(unsigned long sour,uchar *dest){
int i,times,j;
uchar bcd_buf[5];
memset(dest,0x20,13);
memcpy(dest+9,"0.00",4);
long_to_bcd(sour,5,bcd_buf);
if(sour<=0){
*dest=0x04;
return 0;
}
times=10;
for(i=0;i<10;i++)
if(sour/timesof10(i)==0){
times=i;
break;
}
for(i=0;i<times;i++){
j=i/2;
if(i%2==0)
*(dest+12-i-1)=(bcd_buf[4-j]&0x0f)+0x30;
else
*(dest+12-i-1)=((bcd_buf[4-j]&0xf0)>>4)+0x30;
}
dest[12]=dest[11];
dest[11]=dest[10];
dest[10]='.';
if(sour<100)
dest[9]=0x30;
if(sour<10)
dest[11]=0x30;
if(times<3)
times=3;
dest[0]=times+1;
return 0;
}
//将ASC转为LONG 例if nums=5,sour="99999",then result=99999;
unsigned long asc_to_long(uchar nums,uchar *sour){
uchar i;
unsigned long result1=0;
if(NotNAsc(sour,nums))
return 0;
for(i=0;i<nums;i++)
result1+=(*(sour+i)-0x30)*timesof10(nums-i-1);
return result1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -