小和的所谓36进制,即数字加字母的组合,按他的处理还可以用, 手机前三位组合不过一百,后8位组合可达一亿,六位36进制组合可达20多亿,可以满足但是黑馬王子的16进制是不行的。。与no title 所说的无关,我们是说字符的组合,与存贮无关。
可以借鉴一下这个函数: function CalkBlkCRC16( buf: pointer ; size: integer ) : WORD; begin result:=$FFFF; while size > 0 do begin result := result xor BYTE(buf^); result := Swap(result); result := result xor ((result and $ff00) shl 4); result := result xor (result shr 12); result := result xor ((result and $ff00) shr 5); Dec(size); Inc(DWORD(buf)); end; end;
你的要求是6位数字,最多能区分一百万个号码
is impossible
先了解一下36进制
36进制和10进制对应
36进制: 1,2,3...9,a,b...z
10进制: 1,2,3...9,10,11..35
有了上面的认识之后,接下来我们开始谈算法:
因为前3位一般为131,132,133,134,135,136,137,138,139,159之类的类最多不会超过36个,
所以我们前面3位我们用一位36进制可以代替,具体怎样对应随你了
后面的8位,因为十进制的99999999(这个应该算是8位最大的数了吧)转换为36进制为NM4HR,为5位数,所以后面的手机号后面的8位数完全可以转换为一个5位的数,
加上前面的1位,正好6位,符合6位数的要求,只不过不知楼主是否允许出现字母,如果不允许的话,就没办法了
具体10进制转换为36进制的转换原则为除36取余法
手机前三位组合不过一百,后8位组合可达一亿,六位36进制组合可达20多亿,可以满足但是黑馬王子的16进制是不行的。。与no title 所说的无关,我们是说字符的组合,与存贮无关。
function CalkBlkCRC16( buf: pointer ; size: integer ) : WORD;
begin
result:=$FFFF;
while size > 0 do begin
result := result xor BYTE(buf^);
result := Swap(result);
result := result xor ((result and $ff00) shl 4);
result := result xor (result shr 12);
result := result xor ((result and $ff00) shr 5);
Dec(size);
Inc(DWORD(buf));
end;
end;