off topic: php - acortar una cadena

2011-01-19 Por tema 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

2011-01-19 Por tema Juan C. Olivares
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. ad...@aim.cl


 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

2011-01-19 Por tema 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.ad...@aim.cl



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

2011-01-19 Por tema Juan C. Olivares
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. ad...@aim.cl


 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.ad...@aim.cl


 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

2011-01-19 Por tema 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.ad...@aim.cl



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.ad...@aim.cl



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

2011-01-19 Por tema Juan C. Olivares
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. ad...@aim.cl


 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.ad...@aim.cl


 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.ad...@aim.cl


  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

2011-01-19 Por tema Miguel Oyarzo O.


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.ad...@aim.cl



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.ad...@aim.cl



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.ad...@aim.cl


  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

2011-01-19 Por tema Aldrin Martoq

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/