做了一个 62 进制的简单实现
2021-05-01 00:30
801 查看
做了一个 62 进制的简单实现
62 进制需要的字符及次序: 0..9 a..z A..Z; 只实现了 62 进制字符串与正整数的互换.
unit H62; interface uses SysUtils; function IntToH62(N: UInt64): string; //整数转到 62 进制字符串 function H62ToInt(S: string): UInt64; //62 进制字符串转到整数 implementation function _C2B(C: Char): Byte; inline; begin Result := 0; if CharInSet(C, ['0'..'9']) then Exit(Byte(C) - 48); //0..9 if CharInSet(C, ['a'..'z']) then Exit(Byte(C) - 97 + 10); //a..z if CharInSet(C, ['A'..'Z']) then Exit(Byte(C) - 65 + 36); //A..Z end; function _B2C(B: Byte): Char; inline; begin Result := #0; if B = 10) and (B = 36) and (B 0) then Result := _C2B(C) * _Power(62, N); end; function IntToH62(N: UInt64): string; var C: Char; begin Result := ''; repeat C := _B2C(N mod 62); Result := C + Result; N := N div 62; until (N = 0); end; function H62ToInt(S: string): UInt64; var C: Char; L,N,I: Cardinal; begin Result := 0; L := Length(S); if L > 11 then raise Exception.Create('Err: H62ToInt'); //不能多于 11 位 for I := L downto 1 do begin C := S[I]; N := L - I; Result := Result + _C2V(C, N); end; end; end.
//测试: uses H62; procedure TForm1.FormCreate(Sender: TObject); var n: Cardinal; I: UInt64; str: string; begin str := IntToH62(MaxInt); // 2lkCB1 n := H62ToInt(str); // 2147483647 I := 9999999999999999999; // 19 位 str := IntToH62(I); // bUI6zOLZTrh str := 'ZZZZZZZZZZZ'; // 最大值 I := H62ToInt(str); // 15143072536417990655; 比 UInt64 的最大值(18446744073709551615)小一点, 比 Int64 的最大值(9223372036854775807)大一点 end;
相关文章推荐
- Windows Server 2008 R2 负载平衡入门篇Apache2.2+Tomcat7.0整合配置详解
- 使用Scala写了个简单的Scheme解释器
- 现在使用控件, 更喜欢继承
- 写了一个字符串的二维表: TSta
- 覆盖、再覆盖
- 记一次失败的Perl + Nginx + FastCGI 配置过程
- 执行 Application.Terminate 后, OnDestroy 中的代码还会执行
- Perl Dancer 学习(一)
- 关于字符串, 之前没这样用过
- 以接口为主导的设计中, 我在使用的框架模式
- 结合领域驱动设计的SOA分布式软件架构
- 获取程序自身大小的函数
- 捕捉 midi 输入消息的基本程序
- Delphi XE2 之 FireMonkey 入门(9) - TBitmap
- C#综合揭秘——细说进程、应用程序域与上下文之间的关系C#综合揭秘——细说多线程(下)”
- WCF揭秘——共享数据契约
- 使用泛型, 写一个为任意类型的动态数组添加元素的方法
- 准备理一下菜单和工具栏相关的组件
- 发现 TSplitter 在嵌套时不好用, 索性写了个替代品
- Action 相关组件