Re: off topic: php - acortar una cadena
On Jan 20, 2011, at 1:12 AM, Miguel Oyarzo O. wrote: > Investigue y todas las funciones q pille (hasta codificacion eb base por alli > 256) y todas fallan con mi numero de 21 digitos. Es muy grande para tratarlo > facilmente en PHP. Un número de 21 dígitos es muy grande para PHP (32bits == 2147483648 ~= 9 dígitos). Tienes que usar una biblioteca para números grandes. Como dijo Juan C. , con base 126 alcanzas a cubrir en 10 caracteres un número de 21 dígitos decimal. Si tu aplicación soporta un "string binario" no hay problema; de lo contrario, con 126 símbolos no puedes usar caracteres legibles en ASCII el cual tiene apenas 95 caracteres imprimibles. Programar algo que traspase de una base X a otra es algo trivial (estoy cachando que lo podrían usar como el fizzbuzz). Acá una implementación en python (que sí soporta números grandes), es penca la implementación pero funciona con base 92. Si puedes poner binarios, agranda el string CHARS con los caracteres extras, por ejemplo el signo del euro, etc... ojo que debes editar el archivo en ISO8859-1 o latín-1 o similar, si usas un editor UTF-8 tal vez repitas algún símbolo de la base. En realidad, deberías generar programaticamente tus símbolos... eso. --- ini -- #!/usr/bin/env python # coding: latin-1 CHARS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+-=,.<>:;[]{}\|/?~ "; BASE=len(CHARS) print "BASE ES: %d" % (BASE) def encode(num, base = BASE): out = "" while num > 0: mod = num % base num = num / base out += CHARS[mod] return out[::-1] def decode(str, base = BASE): num = 0 ite = 0 while len(str) > 0: chr = str[-1] str = str[:-1] ind = CHARS.find(chr) num += ind * (base ** ite) ite += 1 return num # probar import random for i in range(10): orig = random.randint(1, 9) codificado = encode(orig) decodificado = decode(codificado) print "%s %s => %s => %s" % (decodificado == orig, orig, codificado, decodificado) -- fin --- Aldrin Martoq http://aldrin.martoq.cl/
Re: off topic: php - acortar una cadena
Investigue y todas las funciones q pille (hasta codificacion eb base por alli 256) y todas fallan con mi numero de 21 digitos. Es muy grande para tratarlo facilmente en PHP. Quizas otro tipo de tratamiento, como gzip o similar (para PHP), pero igual me dejan una cadena mínima de 14 caracteres. = Miguel A. Oyarzo O. Ingeniería en Redes y Telecomunicaciones Austro Internet S.A. & INALAMBRICA S.A. Teléfono: [+05661] 710030 Punta Arenas - Chile Linux User: # 483188 - counter.li.org = El 19-01-2011 23:53, Juan C. Olivares escribió: Miguel: Así es. Para saber la cantidad de dígitos según la base, se puede usar ceil(log[baseX](10^25)) Por ejemplo: log35(10^25) = 13.6 Al contrario, puedes calcular la base mínima que necesitas: (10^25)(1/10) = 125.8 Necesitaas una base de 126 para llegar a 10 dígitos :) Otra forma más simple podría ser usando una llave en una base de datos o en memcached. Por ejemplo, calcular un aleatorio y guardar su significado ¿te sirve?. 2011/1/19 Miguel Oyarzo O. Juan C. Olivares No se exactamente a que te refieres como "arreglo de bytes" pero lo que hice fue pasar la cadena numerica a base 35 y aun asi solo puedo obtener una representacion en 14 caracteres de 0 a la z. = Miguel A. Oyarzo O. Ingeniería en Redes y Telecomunicaciones Austro Internet S.A.& INALAMBRICA S.A. Teléfono: [+05661] 710030 Punta Arenas - Chile Linux User: # 483188 - counter.li.org = El 19-01-2011 22:32, Juan C. Olivares escribió: Miguel: Lo que pasa es que ahí estás pasando a base64 el string. Lo que deberías hacer es obtener el número como arreglo de bytes... no sé cómo se hace exactamente en PHP. 2011/1/19 Miguel Oyarzo O. Eso pensé yo, pero mira echo base64_encode("801816020110119185516"); Salida: ODAxODE2MDIwMTEwMTE5MTg1NTE2 = Miguel A. Oyarzo O. Ingeniería en Redes y Telecomunicaciones Austro Internet S.A.&INALAMBRICA S.A. Teléfono: [+05661] 710030 Punta Arenas - Chile Linux User: # 483188 - counter.li.org = El 19-01-2011 22:20, Juan C. Olivares escribió: Como, al parecer, esa variable es numérica, es súper simple. Sólo debes cambiar la base (por ejemplo: decimal a base64). En teoría, el valor máximo de 21 caracteres (10^21) puede ser representado por 12 caracteres en base 64. Puedes usar las funciones de base64 existentes en PHP: http://php.net/manual/es/function.base64-encode.php http://php.net/manual/en/function.base64-decode.php 2011/1/19 Miguel Oyarzo O. Estimados, Necesito acortar de cualquier forma una variable de 21 caracteres y dejar una representacion en solo 10. Ejemplo: echo acortar("192034123456456789098"); Salida: !QQ23"!EQW echo deacortar("!QQ23"!EQW"); Salida: 192034123456456789098 No más de 10 (ese es el problem). Alguna sugerencia? -- = Miguel A. Oyarzo O. Ingeniería en Redes y Telecomunicaciones Austro Internet S.A.& INALAMBRICA S.A. Teléfono: [+05661] 710030 Punta Arenas - Chile Linux User: # 483188 - counter.li.org =
Re: off topic: php - acortar una cadena
Miguel: Así es. Para saber la cantidad de dígitos según la base, se puede usar ceil(log[baseX](10^25)) Por ejemplo: log35(10^25) = 13.6 Al contrario, puedes calcular la base mínima que necesitas: (10^25)(1/10) = 125.8 Necesitaas una base de 126 para llegar a 10 dígitos :) Otra forma más simple podría ser usando una llave en una base de datos o en memcached. Por ejemplo, calcular un aleatorio y guardar su significado ¿te sirve?. 2011/1/19 Miguel Oyarzo O. > > Juan C. Olivares > No se exactamente a que te refieres como "arreglo de bytes" pero lo que > hice fue pasar la cadena numerica a base 35 y aun asi solo puedo obtener una > representacion en 14 caracteres de 0 a la z. > > > > = > Miguel A. Oyarzo O. > Ingeniería en Redes y Telecomunicaciones > Austro Internet S.A. & INALAMBRICA S.A. > Teléfono: [+05661] 710030 > Punta Arenas - Chile > Linux User: # 483188 - counter.li.org > = > > El 19-01-2011 22:32, Juan C. Olivares escribió: > > Miguel: >> >> Lo que pasa es que ahí estás pasando a base64 el string. Lo que deberías >> hacer es obtener el número como arreglo de bytes... no sé cómo se hace >> exactamente en PHP. >> >> 2011/1/19 Miguel Oyarzo O. >> >> >>> Eso pensé yo, pero mira >>> >>> echo base64_encode("801816020110119185516"); >>> Salida: ODAxODE2MDIwMTEwMTE5MTg1NTE2 >>> >>> >>> = >>> Miguel A. Oyarzo O. >>> Ingeniería en Redes y Telecomunicaciones >>> Austro Internet S.A.& INALAMBRICA S.A. >>> Teléfono: [+05661] 710030 >>> Punta Arenas - Chile >>> Linux User: # 483188 - counter.li.org >>> = >>> >>> El 19-01-2011 22:20, Juan C. Olivares escribió: >>> >>> Como, al parecer, esa variable es numérica, es súper simple. Sólo debes >>> cambiar la base (por ejemplo: decimal a base64). En teoría, el valor máximo de 21 caracteres (10^21) puede ser representado por 12 caracteres en base 64. Puedes usar las funciones de base64 existentes en PHP: http://php.net/manual/es/function.base64-encode.php http://php.net/manual/en/function.base64-decode.php 2011/1/19 Miguel Oyarzo O. Estimados, > > Necesito acortar de cualquier forma una variable de 21 caracteres y > dejar > una representacion en solo 10. > > Ejemplo: > > echo acortar("192034123456456789098"); > Salida: !QQ23"!EQW > > echo deacortar("!QQ23"!EQW"); > Salida: 192034123456456789098 > > No más de 10 (ese es el problem). > Alguna sugerencia? > > -- > = > Miguel A. Oyarzo O. > Ingeniería en Redes y Telecomunicaciones > Austro Internet S.A.&INALAMBRICA S.A. > Teléfono: [+05661] 710030 > Punta Arenas - Chile > Linux User: # 483188 - counter.li.org > = > > > >> >> -- Atte, Juan Cristóbal Olivares *Renovarse o morir: Mi PC de los sesenta tenía veinte mil militantes. Y mi PC del siglo XXI tiene cuarenta gigabytes.*
Re: off topic: php - acortar una cadena
Juan C. Olivares No se exactamente a que te refieres como "arreglo de bytes" pero lo que hice fue pasar la cadena numerica a base 35 y aun asi solo puedo obtener una representacion en 14 caracteres de 0 a la z. = Miguel A. Oyarzo O. Ingeniería en Redes y Telecomunicaciones Austro Internet S.A. & INALAMBRICA S.A. Teléfono: [+05661] 710030 Punta Arenas - Chile Linux User: # 483188 - counter.li.org = El 19-01-2011 22:32, Juan C. Olivares escribió: Miguel: Lo que pasa es que ahí estás pasando a base64 el string. Lo que deberías hacer es obtener el número como arreglo de bytes... no sé cómo se hace exactamente en PHP. 2011/1/19 Miguel Oyarzo O. Eso pensé yo, pero mira echo base64_encode("801816020110119185516"); Salida: ODAxODE2MDIwMTEwMTE5MTg1NTE2 = Miguel A. Oyarzo O. Ingeniería en Redes y Telecomunicaciones Austro Internet S.A.& INALAMBRICA S.A. Teléfono: [+05661] 710030 Punta Arenas - Chile Linux User: # 483188 - counter.li.org = El 19-01-2011 22:20, Juan C. Olivares escribió: Como, al parecer, esa variable es numérica, es súper simple. Sólo debes cambiar la base (por ejemplo: decimal a base64). En teoría, el valor máximo de 21 caracteres (10^21) puede ser representado por 12 caracteres en base 64. Puedes usar las funciones de base64 existentes en PHP: http://php.net/manual/es/function.base64-encode.php http://php.net/manual/en/function.base64-decode.php 2011/1/19 Miguel Oyarzo O. Estimados, Necesito acortar de cualquier forma una variable de 21 caracteres y dejar una representacion en solo 10. Ejemplo: echo acortar("192034123456456789098"); Salida: !QQ23"!EQW echo deacortar("!QQ23"!EQW"); Salida: 192034123456456789098 No más de 10 (ese es el problem). Alguna sugerencia? -- = Miguel A. Oyarzo O. Ingeniería en Redes y Telecomunicaciones Austro Internet S.A.&INALAMBRICA S.A. Teléfono: [+05661] 710030 Punta Arenas - Chile Linux User: # 483188 - counter.li.org =
Re: off topic: php - acortar una cadena
Miguel: Lo que pasa es que ahí estás pasando a base64 el string. Lo que deberías hacer es obtener el número como arreglo de bytes... no sé cómo se hace exactamente en PHP. 2011/1/19 Miguel Oyarzo O. > > Eso pensé yo, pero mira > > echo base64_encode("801816020110119185516"); > Salida: ODAxODE2MDIwMTEwMTE5MTg1NTE2 > > > = > Miguel A. Oyarzo O. > Ingeniería en Redes y Telecomunicaciones > Austro Internet S.A. & INALAMBRICA S.A. > Teléfono: [+05661] 710030 > Punta Arenas - Chile > Linux User: # 483188 - counter.li.org > = > > El 19-01-2011 22:20, Juan C. Olivares escribió: > > Como, al parecer, esa variable es numérica, es súper simple. Sólo debes >> cambiar la base (por ejemplo: decimal a base64). >> >> En teoría, el valor máximo de 21 caracteres (10^21) puede ser representado >> por 12 caracteres en base 64. Puedes usar las funciones de base64 >> existentes >> en PHP: >> >> http://php.net/manual/es/function.base64-encode.php >> http://php.net/manual/en/function.base64-decode.php >> >> 2011/1/19 Miguel Oyarzo O. >> >> >>> Estimados, >>> >>> Necesito acortar de cualquier forma una variable de 21 caracteres y dejar >>> una representacion en solo 10. >>> >>> Ejemplo: >>> >>> echo acortar("192034123456456789098"); >>> Salida: !QQ23"!EQW >>> >>> echo deacortar("!QQ23"!EQW"); >>> Salida: 192034123456456789098 >>> >>> No más de 10 (ese es el problem). >>> Alguna sugerencia? >>> >>> -- >>> = >>> Miguel A. Oyarzo O. >>> Ingeniería en Redes y Telecomunicaciones >>> Austro Internet S.A.& INALAMBRICA S.A. >>> Teléfono: [+05661] 710030 >>> Punta Arenas - Chile >>> Linux User: # 483188 - counter.li.org >>> = >>> >>> >> >> >> -- Atte, Juan Cristóbal Olivares *Renovarse o morir: Mi PC de los sesenta tenía veinte mil militantes. Y mi PC del siglo XXI tiene cuarenta gigabytes.*
Re: off topic: php - acortar una cadena
Eso pensé yo, pero mira echo base64_encode("801816020110119185516"); Salida: ODAxODE2MDIwMTEwMTE5MTg1NTE2 = Miguel A. Oyarzo O. Ingeniería en Redes y Telecomunicaciones Austro Internet S.A. & INALAMBRICA S.A. Teléfono: [+05661] 710030 Punta Arenas - Chile Linux User: # 483188 - counter.li.org = El 19-01-2011 22:20, Juan C. Olivares escribió: Como, al parecer, esa variable es numérica, es súper simple. Sólo debes cambiar la base (por ejemplo: decimal a base64). En teoría, el valor máximo de 21 caracteres (10^21) puede ser representado por 12 caracteres en base 64. Puedes usar las funciones de base64 existentes en PHP: http://php.net/manual/es/function.base64-encode.php http://php.net/manual/en/function.base64-decode.php 2011/1/19 Miguel Oyarzo O. Estimados, Necesito acortar de cualquier forma una variable de 21 caracteres y dejar una representacion en solo 10. Ejemplo: echo acortar("192034123456456789098"); Salida: !QQ23"!EQW echo deacortar("!QQ23"!EQW"); Salida: 192034123456456789098 No más de 10 (ese es el problem). Alguna sugerencia? -- = Miguel A. Oyarzo O. Ingeniería en Redes y Telecomunicaciones Austro Internet S.A.& INALAMBRICA S.A. Teléfono: [+05661] 710030 Punta Arenas - Chile Linux User: # 483188 - counter.li.org =
Re: off topic: php - acortar una cadena
Como, al parecer, esa variable es numérica, es súper simple. Sólo debes cambiar la base (por ejemplo: decimal a base64). En teoría, el valor máximo de 21 caracteres (10^21) puede ser representado por 12 caracteres en base 64. Puedes usar las funciones de base64 existentes en PHP: http://php.net/manual/es/function.base64-encode.php http://php.net/manual/en/function.base64-decode.php 2011/1/19 Miguel Oyarzo O. > > Estimados, > > Necesito acortar de cualquier forma una variable de 21 caracteres y dejar > una representacion en solo 10. > > Ejemplo: > > echo acortar("192034123456456789098"); > Salida: !QQ23"!EQW > > echo deacortar("!QQ23"!EQW"); > Salida: 192034123456456789098 > > No más de 10 (ese es el problem). > Alguna sugerencia? > > -- > = > Miguel A. Oyarzo O. > Ingeniería en Redes y Telecomunicaciones > Austro Internet S.A. & INALAMBRICA S.A. > Teléfono: [+05661] 710030 > Punta Arenas - Chile > Linux User: # 483188 - counter.li.org > = > -- Atte, Juan Cristóbal Olivares *Renovarse o morir: Mi PC de los sesenta tenía veinte mil militantes. Y mi PC del siglo XXI tiene cuarenta gigabytes.*
off topic: php - acortar una cadena
Estimados, Necesito acortar de cualquier forma una variable de 21 caracteres y dejar una representacion en solo 10. Ejemplo: echo acortar("192034123456456789098"); Salida: !QQ23"!EQW echo deacortar("!QQ23"!EQW"); Salida: 192034123456456789098 No más de 10 (ese es el problem). Alguna sugerencia? -- = Miguel A. Oyarzo O. Ingeniería en Redes y Telecomunicaciones Austro Internet S.A. & INALAMBRICA S.A. Teléfono: [+05661] 710030 Punta Arenas - Chile Linux User: # 483188 - counter.li.org =