转自:http://hi.baidu.com/superfeng/item/12a8bfde13bc934fdcf9be4d
最近被暂时抽调到单位的收费部门让帮忙搞数字有线电视。
在批量转移用户的同时还要转移原来的几千户采用洛阳数字电视前端的用户的档案,再转移的时候发现有线电视用户卡最后的一位数字是识别码,几经周折找到了数字卡的开发人员,他告诉了我这个识别码的算法,内容如下:
===============================邮箱原文==========================================
>> 这个是国标的,有本书《识别卡国家标准汇编》中国出版社,如果你买到这本书,在57页
>> GB/T 15694.1-1995 的附录B中描述的
>>
>> 计算luhn模10“各位乘2加"校验数字公式
>> 计算步骤如下:
>> 步骤1:从右边第一个数字(低序)其实每隔一位乘以2
>> 步骤2:把步骤1中获得的乘机的各位数字与原号码中未乘2的各位数据相加
>> 步骤3:从临近较高的一个以0结尾的数中减去步骤2中得到的总和[这相当于求这个综合的地位数字(各位数)的”10的补数“]。
>> 如果步骤2得到的综合是以0结尾的数(如30,40等等),则检验数字是0。
>>
>> 例如 无校验数字帐号 4992 73 9871
>> 4 9 9 2 7 3 9 8 7 1
>> *2 *2 *2 *2 *2
>> -------------------------------------------
>> 18 4 6 16 2
>>
>> 4+1+8+9+4+7+6+9+1+6+7+2=64
>>
>> 70-64 = 6
>>
>> 那么带有校验位的数字帐号就是 4992 73 9871 6
============================我简单写的算法=================================
<SCRIPT Language="VBScript">
function sd(sn)
count=len(sn)
For i = 0 To (count - 1)
sn1 = sn1 & (Mid(sn,(count-i),1)*2)
i = i + 1
Next
Dim sn2
sn2 = 0
For i = 0 To (count - 1)
i = i + 1
If i = count Then Exit for
sn2 = sn2 + cint(Mid(sn,(count-i),1))
Next
count = Len(sn1)
Dim sn3
sn3 = 0
For i = 1 To count
sn3 = sn3 + CInt(Mid(sn1,i,1))
Next
sn4 = sn2 + sn3
sd = CInt((CInt(Left(sn4,1)) + 1) & 0) - (sn2 + sn3)
If sd = 10 Then
sd = 0
End if
end Function
Function cksn(sn)
count=Len(sn)
If count <> 16 Then
MsgBox "数字卡错误"
Exit function
End if
If CInt(sd(mid(sn,1,count-1))) <> CInt(Mid(sn,count,1)) Then
MsgBox "数字卡错误"
End if
End function
</SCRIPT>
我的见解:如果未乘2的数字颠倒顺序的话,校验码是一样的