PDA

Ver la Versión Completa : Conversion de Strings


FGarcia
02-08-2006, 02:32:09
Hola, Saludos a todos!
MMM... Ya se que en el grupo se ha hablado de este tema de las conversiones pero no he encontrado o no he entendido una respuesta al tema que planteo. Este codigo:

Código Delphi [-] (http://www.clubdelphi.com/foros/#)procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := IntTostr(strtoint(edit1.Text ));
end;



Funciona perfecto si lo que quiero convertir es una cadena de Numeros (1,9,12,456,8900,100000, etc), pero si lo que quiero es convertir en un valor entero una cadena como: C, ST, Hx o similar aparece un mensaje de error que me dice que lo que se ingreso no es un entero valido -creo que es logico- entonces lo que deberia de hacer es obtener su codigo ASCII y he aqui la pregunta ¿Eso como se hace? CHAR solo acepta un caracter, CHR no me acepta el contenido de un string o de un edit1.text ¿que tipo debo usar aqui? El resultado final deberia ser :
1 = 49; 5 = 53; 10 = 49 48; ST = 83 84; Hx = 72 120 y asi segun lo que el usuario ingrese.
Espero haberme dado a entender pero si no avisenme. Gracias por su tiempo y ayuda.


EDITADO:
Encontre este hilo http://www.clubdelphi.com/foros/showthread.php?t=24584&highlight=convertir+string y lo modifique asi:

procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
cadena: string;
total: integer;
c: string;
begin
total := 0;
cadena := 'Bienvenido al ClubDelphi';
for i := 0 to Length(cadena) do
//total := total + Ord(cadena[i]);
c := c + ' ' + IntToStr(Ord(cadena[i]));
//ShowMessage(IntToStr(total));
ShowMessage(c);
end;

y funciona perfectamente como queria. Siguiendo el orden de ideas -no creo que sea para otro hilo- ¿como se podria "ver" un codigo de control? es decir los primeros 31 caracteres de la tabla ASCII.(NUL, SOH, STX, ETX..CR, LF,..US) Gracias nuevamente por la ayuda!

nemesio
02-08-2006, 03:54:52
En verdad que deberías explicar mejor que es lo que quieres. La función es para transformar Enteros a String y la otra de string a entero, que es lo que deseas hacer aparte de eso?

Saludos.

FGarcia
02-08-2006, 05:31:06
Ok, gracias por el interes.
1. Necesito convertir una cadena (string) a su correspondiente valor ASCII y viceversa.
2. La cadena puede estar compuesta de valores numericos (0...infinito) y/o de letras.
3. La longitud de esa cadena por el momento no me interesa restringirla
4. El primer codigo que publique funciona siempre y cuando la cadena sea de solo numeros. Si la cadena esta compuesta por una letra o simbolo genera error. Ej. "C no es un entero valido"
5. el segundo codigo convierte perfectamente a ASCII
6. Falta el regreso de ASCII a String
7. En un momento determinado ¿como evito el mensaje de error mencionado?

esas son mis dudas. Gracias por la ayuda que puedan prestarme

Lepe
02-08-2006, 14:43:57
Creo que estas intentando encontrar una solución sin comprender como llegar a ella.

Tienes Chr y Ord para traducir una letra a su equivalente Ascii y viceversa.

Si el código ascii de cada letra, lo tienes en una cadena separada por espacios, sólo es cuestión de analizar esa cadena.


var ascii : string;
ValorNumerico : integer;
letraFinal : Char;
begin
ascii := '105'; // representación de la letra "i" en ascii
valornumerico := strtoint(ascii);
letrafinal := chr(valornumerico);

// o resumiendo:
letrafinal := chr(strtoint(ascii));
end;


PD: El segundo código no funciona bien, ya que el bucle for empieza en cero, y un String siempre empieza en el índice uno. Intentalo con la cadena "Bien" y verás que en el ShowMessage obtienes 5 valores ascii, cuando solo hay 4 letras. Eso demuestra que no has analizado bien el código :p

Saludos

seoane
02-08-2006, 15:50:02
Si comprendo bien lo que quieres hacer, que puede que me equivoque, lo que necesitas es a partir de una cadena de texto obtener otra donde cada letra esta identificada por su código ASCII, y luego realizar el proceso contrario. Esto me recuerda bastante al urlencode / urldecode que se utiliza para las direcciones url, donde los caracteres problemáticos se sustituyen por su valor ASCII precedido del símbolo %. Supongo, y estoy adivinando, que tu te encuentras en el mismo caso, necesitas enviar / guardar una cadena por algún método que solo permite un cierto tipo de caracteres y necesitas poder tratar con los caracteres problemáticos.

Si ese es tu caso te recomiendo el truco 62 (http://www.clubdelphi.com/trucos/index.php?id=62), que hace eso mismo. Aunque si lo que quieres es convertir todos lo caracteres y no utilizar el %, puedes usar algo como esto:


function Encode(Str: string): string;
var
i: integer;
begin
Result:= '';
for i:= 1 to Length(Str) do
Result:= Result + IntToHex(Ord(Str[ i ]),2);
end;

function Decode(Str: string): string;
var
i: integer;
begin
Result:= '';
while Length(Str) > 0 do
begin
if not TryStrToInt('$' + Copy(Str, 2, 2),i) then
begin
Result:= '';
Exit;
end;
Result:= Result + Char(i);
Delete(Str, 1, 2);
end;
end;

FGarcia
02-08-2006, 20:19:25
Nuevamente aqui!

Lepe: En el segunco codigo si detecte lo del caracter de mas que siempres es 0; no corregi cuando envie el mensaje. El codigo que me propones es con el que comence antes de poner este hilo tu le das el valor a la variable ascii = '105' y lo traduce correctamente en la letra i si le das '67' te escribe C, pero eso es lo que tu y yo sabemos que esas son sus equivalencias, un operario estandar solo veria que debe ingresar CASA y el programa hace todo (conversion y lo que tenga que hacer) transparente a el, si intentas que ASCII := 'CASA' se genera un error:

---------------------------
Project1
---------------------------
'C' is not a valid integer value.
---------------------------
Aceptar
---------------------------

y asi comenzo todo....

SEOANE : estas correcto, necesito guardar una cadena en sus valores ASCII o HEX como lo propones. La funcion ENCODE me funciona OK, la DECODE me regresa solo garabatos, estoy revisando para tratar de entender que pasa. Algo valioso es que conoci una nueva sentencia "TryStrToInt".

LEPE, SEOANE Gracias nuevamente por su ayuda y tiempo!

seoane
02-08-2006, 21:36:25
Efectivamente la función decode no va, eso pasa por poner las cosas con prisa.

Ahora si que funciona:

function Decode(Str: string): string;
var
i: integer;
begin
Result:= '';
while Length(Str) > 0 do
begin
if not TryStrToInt('$' + Copy(Str, 1, 2),i) then
begin
Result:= '';
Exit;
end;
Result:= Result + Char(i);
Delete(Str, 1, 2);
end;
end;


Para probarla:

var
s: string;
begin
s:= Encode('Hola mundo');
ShowMessage(s);
s:= Decode(s);
ShowMessage(s);
end;

seoane
02-08-2006, 21:40:12
También te recomiendo el truco 53 (http://www.clubdelphi.com/trucos/index.php?id=53), que además de convertir el texto lo cifra.