|
发表于 2024-3-19 21:40:58
|
显示全部楼层
基于上面的结构,端午写了个64位的汇编版本,基2^62。api不再有返回错误,(只存在内存申请错,则终止)。内存申请可对齐到指定的字节,默认32字节。
简单做了个64位的static lib 作为与其它语言的调用测试(未严格测试正确性),dll调用起来也容易与kernel32.dll无异:- ;==========================================================================================;mpz_read_radix(a,str,radix);radix -64 -2~2 64;map="0123456789ABCDEFGHIJKLMNOPQRSTUVWSYZabcdefghijklmnopqrstuvwxyz+/",20h,',',09h,0ah,0dh;最多10+26+26+2=64个有效字符+分隔号5个=69;预扫描终止符:0或'\[code]#include <stdio.h>typedef _int64 INT64;typedef unsigned _int64 UINT64;typedef unsigned char UCHAR;typedef struct{ UINT64 usd; UINT64 alc; INT64 sng; UINT64 *dat;}MP_INT;void mpz_init(MP_INT *);void mpz_read_radix(MP_INT *,UCHAR *str,UINT64 radix);void mpz_clear(MP_INT *);void main(){ UCHAR *str0=" 7,ff ff,ffff,ffff,fff\$"; UCHAR *str1=" 1,2ab,c03"; UCHAR *str2=" - 10000000, 000f000fefefadadefe000000f0000000 Asdf00,003 fffffff"; MP_INT cT0,cT1,cT2; UINT64 i=0; mpz_init(&cT0); mpz_init(&cT1); mpz_init(&cT2); mpz_read_radix(&cT0,str0,16); mpz_read_radix(&cT1,str1,16); mpz_read_radix(&cT2,str2,64); printf("\ndat0="); for(i=cT0.usd;i>0;i--) printf("%016I64X ",cT0.dat[i-1]); printf("\ndat1="); if(cT1.sng < 0) printf("-"); for(i=cT1.usd;i>0;i--) printf("%016I64X ",cT1.dat[i-1]); printf("\ndat2="); if(cT2.sng < 0) printf("-"); for(i=cT2.usd;i>0;i--) printf("%016I64X ",cT2.dat[i-1]); mpz_clear(&cT0); mpz_clear(&cT1); mpz_clear(&cT2); system("pause");}
复制代码
;输入串,以0结束或以\$结束:
;str[]="-12abc03";
;str[]=" 1,2ab,c03";
;str[]=" - 1, 2ab,c03\$afdf"; 预扫描有效字符' - 1, 2ab,c03\
;==========================================================================================[/code] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|