none
algoritmo de contenedores RRS feed

  • Pregunta

  • Alguien tiene el algoritmo en vb.net o c# de contenedores?

    Identificación

    La identificación de contenedores se efectúa mediante una combinación alfanumérica de 11 dígitos.<sup class="reference" id="cite_ref-3" style="line-height:1em;">3</sup>

    Las primeras tres letras identifican al propietario y son asignadas a las compañías por el BIC (Bureau International des Containers et du Trasnport Intermodal). La cuarta letra toma los siguientes valores:

    • U para identificar a los contenedores propiamente dichos.
    • J para el equipo auxiliar adosable.
    • Z para chasis o trailers de transporte vial.

    luego siguen 6 dígitos numéricos y por último un dígito verificador para asegurar la correcta relación con los 10 anteriores.

    Este dígito verificador es de suma importancia pues garantiza en transmisiones y en el ingreso a sistemas asistidos por ordenadores su correcta escritura. Se calcula mediante un algoritmo que se detalla a continuación. En primer lugar, las letras reciben un valor de acuerdo con la siguiente tabla:

    Tabla de asignación de valores numéricos al alfabeto
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
    10 12 13 14 15 16 17 18 19 20 21 23 24 25 26 27 28 29 30 31 32 34 35 36 37 38
    • Nota: el valor 11 y sus múltiplos 22 y 33 se ignoran.

    Tomando como ejemplo el contenedor de la fotografía: HOYU 751013 dígito verificador 6, se efectúa la suma de cada uno de los 10 primeros dígitos multiplicados por una potencia creciente de 2.

    H=18 entonces 18 x 2^0= 18x1= 18

    O=26 entonces 26 x 2^1= 26x2= 52

    Y=37 entonces 37 x 2^2= 37x4=148

    U=32 entonces 32 x 2^3= 32x8=256

    7=7 entonces 7 x 2^4= 7x16=112

    5=5 entonces 5 x 2^5= 5x32=160

    1=1 entonces 1 x 2^6= 1x64= 64

    0=0 entonces 0 x 2^7= 0x128= 0

    1=1 entonces 1 x 2^8= 1x256=256

    3=3 entonces 3 x 2^9= 3x512=1536

    La sumatoria las cifras anteriores, que es igual a 2602, se divide por 11.

    \frac {2602} {11}=236,5454

    Se ignora la parte decimal

     236 \,

    Se multiplica por 11

     236 * 11 = 2596 \,

    La diferencia entre la suma original, 2602, y este número, 2596, es el dígito verificador o dígito de control. En este caso, 6.

     2602 - 2596 = 6 \,

    Si el valor resultante es 10 el dígito verificador es 0.

    Todos los sistemas digitales efectúan este cálculo en el momento del ingreso de un contenedor, la no validación del dígito notifica al operador que algún dato es incorrecto.

    martes, 26 de febrero de 2013 22:39

Todas las respuestas

  • Por si sirve en Java:

    import java.util.regex.*;
    
    /**
     *
     * @author macpro2
     */
    public class Container {
        
        public static String regex  = "[A-Z]{3}[UJC](([0-9]){7})";
        
        public static int asign[] = {10,12,13,14,15,16,17,18,19,20,21,23,24,25,26,27,28,29,30,31,32,34,35,36,37,38};
        
        public static boolean validate(String numcont){
            boolean band = false;
            Pattern pat = Pattern.compile(regex);
            Matcher mat = pat.matcher(numcont);
            
            if (!mat.matches()){
                return false;
            }
            
            int n = 0;
            int c = 0;
            int s = 0;
            int p = 0;
            int m = 0;
            
            int res = 0;
            int dv = 0;
            
            for (int i=0; i<4; i++){
                n = ((int) numcont.charAt(i))-65;
                m = (int) Math.pow(2,c++); 
                p = asign[n]*m;
                s+=p;
            }
            
            for (int i=4; i<10; i++){
                n = ((int) numcont.charAt(i))-48;
                m = (int) Math.pow(2,c++); 
                p = n*m;
                s+=p;
                //System.out.println(String.format("n=%d, m = %d, p = %d, s = %d ",n,m,p,s));
            }
            
            res = (int) s / 11;
            res = res * 11;
            dv = ((int) numcont.charAt(10))-48;
            
            if(s-res==dv){
               band = true;
            }
            
           return band;
        }
        
        /*
        public static void main(String args[]){
            String cont = "HOYU7510136";
            
            System.out.println(validate(cont));
        }
        */
    }



    • Editado gmendez1 jueves, 14 de abril de 2022 16:03
    jueves, 14 de abril de 2022 16:02