集装箱箱号验证算法(C#版)

集装箱号由4位公司代码和7位数字组成(如CBHU3202732),其中第七位数字就是校验码。首先将公司代码转换为数字,去掉11及其倍数,连加除以11,其余数为校验位。 A=10 B=12 C=13 D=14 E=15 F=16 G=17 H=18 I=19 J=20 K=21 L=23 M=24  
N=25 O=26 P=27 Q=28 R=29 S=30 T=31 U=32 V=34 W=35 X=36 Y=37 Z=38

标准箱号构成基本概念:采用ISO6346(1995)标准。标准集装箱箱号由11位编码组成,包括三个部分:
1、 第一部分由4位英文字母组成。前三位代码 (Owner Code) 主要说明箱主、经营人,第四位代码说明集装箱的类型。列如CBHU 开头的标准集装箱是表明箱主和经营人为中远集运
2、 第二部分由6位数字组成。是箱体注册码(Registration Code), 用于一个集装箱箱体持有的唯一标识。3、 第三部分为校验码(Check Digit)由前4位字母和6位数字经过校验规则运算得到,用于识别在校验时是否发生错误。即第11位数字。 根据校验规则箱号的每个字母和数字都有一个运算的对应值。箱号的前10位字母和数字的对应值从0到Z对应数值为0到38,11、22、33不能对11取模数,所以要除去。.
2、第N位的箱号对应值再分别乘以2的(N-1)次方 (N=1,2,3………..10)
例如:箱号为CBHU3202732的集装箱它的第1位代码为C,
它的代码值=代码的对应值×2的(1-1)次方 =13×1=13。
类推第2位代码为B
它的代码值=代码的对应值×2的(2-1 )次方=12×2=24 以此类推得到箱号前10位代码的代码值,将前10位的代码值乘积累加后对11取模箱号为CBHU3202732的集装箱前10位箱号的代码累加值=4061,取11的模后为2,就是这个箱号第11位的识别码的数值。
以此类推,就能得到校验码。

 

//判断箱号正误
private bool isRight(string daima, string xianghao)
{
try
{
//获取代码的每位计算值
string char1 = daima.Substring(0, 1);
int i1 = changevalue(char1);
string char2 = daima.Substring(1, 1);
int i2 = changevalue(char2);
string char3 = daima.Substring(2, 1);
int i3 = changevalue(char3);
string char4 = daima.Substring(3, 1);
int i4 = changevalue(char4);
//获取7位箱号的计算值
int int1 = int.Parse(xianghao.Substring(0, 1));
int int2 = int.Parse(xianghao.Substring(1, 1));
int int3 = int.Parse(xianghao.Substring(2, 1));
int int4 = int.Parse(xianghao.Substring(3, 1));
int int5 = int.Parse(xianghao.Substring(4, 1));
int int6 = int.Parse(xianghao.Substring(5, 1));
int int7 = int.Parse(xianghao.Substring(6, 1));
//计算值求和并对11取余,和第七位箱号对比
int sum = i1 + 2 * i2 + 4 * i3 + 8 * i4 + 16 * int1 + 32 * int2 + 64 * int3 + 128 * int4 + 256 * int5 + 512 * int6;
int result = sum % 11;

if (result==int7||result-int7==10)
{
return true;
}
else
{
return false;
}
}
catch (Exception)
{
return false;
throw;
}
}

 


//获取代码的计算数值
private int changevalue(string str)
{
if ((str == "a") || (str == "A"))
return 10;
else if ((str == "b") || (str == "B"))
return 12;
else if ((str == "c") || (str == "C"))
return 13;
else if ((str == "d") || (str == "D"))
return 14;
else if ((str == "e") || (str == "E"))
return 15;
else if ((str == "f") || (str == "F"))
return 16;
else if ((str == "g") || (str == "G"))
return 17;
else if ((str == "h") || (str == "H"))
return 18;
else if ((str == "i") || (str == "I"))
return 19;
else if ((str == "j") || (str == "J"))
return 20;
else if ((str == "k") || (str == "K"))
return 21;
else if ((str == "l") || (str == "L"))
return 23;
else if ((str == "m") || (str == "M"))
return 24;
else if ((str == "n") || (str == "N"))
return 25;
else if ((str == "o") || (str == "O"))
return 26;
else if ((str == "p") || (str == "P"))
return 27;
else if ((str == "q") || (str == "Q"))
return 28;
else if ((str == "r") || (str == "R"))
return 29;
else if ((str == "s") || (str == "S"))
return 30;
else if ((str == "t") || (str == "T"))
return 31;
else if ((str == "u") || (str == "U"))
return 32;
else if ((str == "v") || (str == "V"))
return 34;
else if ((str == "w") || (str == "W"))
return 35;
else if ((str == "x") || (str == "X"))
return 36;
else if ((str == "y") || (str == "Y"))
return 37;
else if ((str == "z") || (str == "Z"))
return 38;
else
return -1000;
}

posted @ 2014-09-30 15:30  锋利的C#  阅读(3802)  评论(5编辑  收藏  举报