集裝箱箱號驗證算法(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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM