文档章节

做了一个 62 进制的简单实现

涂孟超
 涂孟超
发布于 2014/09/26 15:38
字数 374
阅读 12
收藏 0

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 <= 9 then Exit(Char(B + 48));                       //0..9
  if (B >= 10) and (B <= 35) then Exit(Char(B - 10 + 97)); //a..z
  if (B >= 36) and (B <= 61) then Exit(Char(B - 36 + 65)); //A..Z
end;

function _Power(B,P: Cardinal): UInt64; inline;
var
  i: Integer;
begin
  Result := B;
  for i := 1 to P-1 do Result := Result * B;
end;

function _C2V(C: Char; N: Byte): UInt64; inline;
begin
  Result := 0;
  if (N = 0) then Exit(_C2B(C));
  if (N > 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;

本文转载自:http://www.cnblogs.com/del/p/3172098.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
短网址服务(TinyURL)生成算法

前不久做了一个优惠劵的分享功能,其中一个功能就是生成一个优惠劵分享短链接。生成的短链接要求每个链接都是唯一的,并且长度尽可能短。在网上查了一下相关的思路,发现了一个不错的算法。这...

浮云骑士LIN
08/23
0
0
短网址(short URL)系统的原理及其实现

背景 提供一个短址服务 你有没有发现,我们的任务中出现长 URL 就会比较麻烦?如果有一个短址生成器就好了。虽然市面上有很多,但是我们可以重复发明一个轮子,利用这个机会尝试一下简单的 ...

琯琯
01/20
0
0
微博短网址原理的算法

短网址一直都在微博上应用。例如腾讯微博的短网址url.cn,新浪的sinaurl.cn等。 他们是如何实现呢,我在网上看了一下,大多是下面的一些思路: 例如:http://url.cn/1zJdGX?type=1&from=19&u...

疯狂的流浪
2012/12/10
13K
29
java java.lang.Long详解之一:toString()

文章看过后感觉受益匪浅,所以留下了以备温故:http://www.congmo.net/blog/2012/03/05/Long-toString/ 陆陆续续花了近两周时间看完了Long.java,可以说收获颇丰。也花了几天时间构思应该如何...

赵小宾
2014/12/08
0
1
C/C++ Base64解码器

Base64被广泛用于xml类型的文档中,通过实现编码和译码,可以练习一下c++ 首先,我们要知道什么是Base64编码。它是把二进制文件存储成为文本文件后的文件的编码,它是64位进制的编码,所以对...

李三乎
2012/09/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

epoll中使用

1、一个线程epoll_wait时,另一个线程调用epoll_ctl是安全的。 2、使用edge触发,在socket有数据到来后,不收取数据,再次调用epoll_ctl将socket加入,仍会触发下一次动作。 asio用该方法来发...

gelare
4分钟前
0
0
PHP规范PSR2

PSR标准 - PSR-2 为了尽可能的提升阅读其他人代码时的效率,下面例举了一系列的通用规则,特别是有关于PHP代码风格的。 各个成员项目间的共性组成了这组代码规范。当开发者们在多个项目中合作...

geek土拨鼠
20分钟前
4
0
【极简】如何在服务器上安装SSL证书?

本文适合任何人了解,图形化操作。下面以腾讯云为例,并且服务器(linux)也安装了宝塔面板。 1.登陆腾讯云账号进入控制台,找到SSL的产品 2.按要求申请并填写表单,记住私钥密码 3.提交后,待...

皇冠小丑
28分钟前
0
0
深入理解编译器

深入理解编译器 原文出处 欢迎向Rust中文社区投稿,投稿地址,好文将在以下地方直接展示 1 Rust中文社区首页 2 Rust中文社区Rust文章栏目 3 知乎专栏Rust语言 编程语言是如何工作的 从内部理解...

krircc
30分钟前
0
0
Centos7&docker-ce&compose&wordpress

如题,最近帮人装个WordPress,想起来用docker方便,这里做个记录。 因为docker要求linux内核版本3.10以上我记得,所以直接用的centos7省去很多麻烦。 主机在国内的先把yum源改成国内的阿里云...

虚拟世界的懒猫
34分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部