Digito Control Tarjetas Sim (Chips de celulares) ya me funciona

249 views
Skip to first unread message

pablo b(La Pampa)

unread,
Aug 10, 2012, 2:17:55 PM8/10/12
to publice...@googlegroups.com
Hola Amigos del foro, gracias a lo que publique en codigo python y a uds con los pocos datos que les pase del algoritmo de luhn para verficar si los 19 digitos de las tarjetas sim (las que usan los celulares) es correcto, Ze roberto me paso el codigo en VFP y pude verificar que funciona perfecto!!!!, me devuelve .T. o .F. depende si esta bien o mal, muchas gracias por su ayuda.
 
Este es el codigo en VFP que logra la verificacion del digito de control y me dice si estan bien los 19 digitos, tambien sirve para chequear las tarjetas de credito por si les sirve alguien mas.
 
?IsLuhnChecksumOK("0000000000000000")
Function IsLuhnChecksumOK(Number_String)
Local Digit
Local i
Local N
Local Result
Local SumDigits
Local nDigits
N = 0
SumDigits = 0
nDigits = Len(Number_String)
For i = nDigits To 1 Step -1
Digit = Val(Substr(Number_String, i, 1))
N = N + 1
If Mod(N , 2) = 0
Digit = Digit * 2
Endif
If Digit > 9
Digit = Digit - 9
Endif
SumDigits = SumDigits + Digit
Next i
Result = Mod(SumDigits ,10)
Return Result = 0
Endfunc
Ahora bien, dado que en otro soft creo que realizado en VisualBasic hacen lo que yo quiero tratar de hacer pero en VFP y no se si se podra ya teniendo ahora como verificar el digito de control y que este todo bien, el tema en cuestion es que yo quiero colocando el numero de sim inicial y el numero de sim final me ponga la correlatividad automaticamente¿me explico?, algo asi
 
Sim de inicio:  8954071100438791503
Sim de Final:   8954071100438791990
entre el numero de inicio y el numero final son 50 las tarjetas sim, lo que quiero saber si puedo hacer y usando ahora el digito de control que verifica si esta bien, es si puedo mostrar y cargar en un grid automaticamente la numeracion correlativa entre los 2 puntos.
 
Muchas Gracias, disculpen tanta insistencia, pero me seria muy util si se pudiera realizar tal tarea por el ahorro en tiempo que esto me lleva
 
Pablo
la Pampa - Argentina
 

ZeRoberto

unread,
Aug 10, 2012, 3:42:29 PM8/10/12
to publice...@googlegroups.com
No entendi muy bien, lo que quieres es saber que numeros hay entre
 
Sim de inicio:  8954071100438791503
 
Y el

Sim de Final:   8954071100438791990
Es eso?
 
Saludos


 

--
 
 
 

Message has been deleted

pablo b(La Pampa)

unread,
Aug 10, 2012, 5:47:15 PM8/10/12
to publice...@googlegroups.com
Hola Roberto aca te paso una gran ayuda que averigue con movistar y que esta a la vista pero nunca me di cuen ta.


Sim de inicio:  8954071100438791503
 
Y el

Sim de Final:   8954071100438791990
Es eso?

Como ves en el  ejemplo inicio y fin si le sacas el digito verificador te das cuenta que vas de a 50 ¿lo ves???, solo resta hacer un bucle con un for o algo similar y agregarle a cada numero el digito verificador, ¿es asi???, puede ser, por lo que me dijeron es asi de simple usando el codigo que me enviaste o que yo publique en python que en caso de no tener el digito verificador le agregar 18 digitos y el verificador te lo dice solo. Avisame si entes, aca abajo te publico como es obtener o que te diga cual es el digito verificador que me tradujo Victor Hugo desde Mexico.,

FUNCTION Calculate_Luhn( tcPartial_Card_Number AS STRING )

    LOCAL lnCheck_Digit As INTEGER
    LOCAL lcCheck_Digit As CHARACTER

    lnCheck_Digit = Luhn_CheckSum( tcPartial_Card_Number + "0" )
    IF lnCheck_Digit > 0
        lnCheck_Digit = 10 - lnCheck_Digit
    ENDIF
    lcCheck_Digit = TRANSFORM( lnCheck_Digit, "@L 9" )
   
    RETURN lcCheck_Digit
*   
en otro prg colocas lo siguiente y te lo muestra

SET PROCEDURE TO DigVerNroTarjeta
? Is_Luhn_Valid("8954071100438791503")
? Calculate_Luhn("895407110043879150")

Ahi ves como seria con tu ejemplo en VFP y con este te dice que seria "3" el digito verificador con el Calculate e ingresando solo 18 digitos.

Ahora tendria que hacer un bucle con un for o algo asi en el cual yo ingrese el numero de inicio y el numero de fin de la caja y me vaya sumando de a uno y agregando el digito verificador a cada numero y listo ¿no??? que te parece, como lo harias???. Saludos

Pablo

Víctor Hugo Espínola Domínguez

unread,
Aug 10, 2012, 8:29:05 PM8/10/12
to publice...@googlegroups.com
Hola Pablo

El problema que has planteado está sumamente interesante. Visual FoxPro maneja los números con una precisión de 16 dígitos, es decir que no puedes utilizar FOR I = NroIni TO NroFin por que tus nros. tienen 18 dígitos, por lo tanto los dígitos 17º y 18º son convertidos a cero en forma automática.
Una solución es convertir tus números a array de digitos y sobre estos array incrementar en uno en este caso.
Adjunto los programas que generan los nros. intermedios.

Saludos.
Víctor.


--
 
 
 

DigVerTarjeta._rar
Message has been deleted

fvs

unread,
Aug 13, 2012, 4:09:53 PM8/13/12
to publice...@googlegroups.com
otra solucion, seria buscar los primeros digitos iguales (por ejemplo mirar 10 digitos) , y luego hacer el bucle for solo con el valor de los restantes digitos, sin contar el digito del control
por ejemplo
Sim de inicio: 8954071100 438791503
Sim de Final:   89 54 07 11 00 438791990

for nNum=43879150 to 43879199
    sImei=sRaiz+str(nNum)
    sImei=sImei+CalculoDigitoControl(sImei)
   .
   .
   .
next
(claro utilizando variables para los limites del for) 

Víctor Hugo

unread,
Aug 13, 2012, 5:13:25 PM8/13/12
to publice...@googlegroups.com
Hola fvs

Qué harías en este caso?:

Sim de inicio: 1999999999999999999
Sim de Final:  2000000000000000555

Salujdos.
Víctor.

Jhonny Zambrana

unread,
Aug 13, 2012, 9:27:57 PM8/13/12
to publice...@googlegroups.com
Apoyo l aidea de crear un arreglo.

fvs

unread,
Aug 14, 2012, 3:08:59 PM8/14/12
to publice...@googlegroups.com
Hola Victor y amigos, 

hombre ese seria un caso bastante extremo, pero sin duda tienes razon. De todas formas comentaros que he confundido el numero de la sim con el imei del telefono, y en el imei por lo menos creo que ese caso no podria llegar a darse nunca.
Pero aun asi, la programacion de esa subrutina de paso a arrays y tratar el numero como elementos de un array es muy interesante.

un saludo, me alegro de aprender cada dia una cosa nueva.

PD. voy a ver como tengo para arreglar el nombre de aparece en lo mensajes, en vez de "yo" aparezca mi nombre.

Víctor Hugo Espínola Domínguez

unread,
Aug 14, 2012, 4:05:27 PM8/14/12
to publice...@googlegroups.com
Hola fvs

En realidad sería uno de los ocho casos extremos.
Nunca te olvides de Murphy:  http://es.wikipedia.org/wiki/Ley_de_Murphy 

Saludos.
Víctor.



--
 
 
 

Reply all
Reply to author
Forward
0 new messages