• 集装箱箱号验证算法(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;
    }

  • 相关阅读:
    AGC030 简要题解
    CF1601 简要题解
    CSP2021 题解
    2021.11.1-2021.11.7总结
    超快速梅森旋转SFMT(SIMD-oriented Fast Mersenne Twister)一览
    2021.10.25-2021.10.31总结
    CSP 2021 游记
    在Windows vs2015环境下编译使用Libevent
    在Windows环境下实现一个简单的libevent服务器
    Thinking in C++ 课后习题自己实现 第二章
  • 原文地址:https://www.cnblogs.com/liuchuanxu/p/4002069.html
Copyright © 2020-2023  润新知