Recent

Author Topic: sumar ascii como hex  (Read 4171 times)

mav

  • Jr. Member
  • **
  • Posts: 79
sumar ascii como hex
« on: April 14, 2021, 10:37:24 pm »
Hola.
Como podria hacer algo así:
  Nombre:string;
...
 Nombre := mayoraprendiendo;
..sumar el valor en hexadecimal de cada segunda letra de nombre y mostrar el resultado en hexadecimal.
Saludos :)

lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: sumar ascii como hex
« Reply #1 on: April 15, 2021, 03:30:33 am »
Suena como si fueran deberes así que mejor que código, una pequeña explicación: Recorre la cadena en un bucle como si fuera un array y, por cada índice par, toma el código de la letra con Ord() y súmalo al total. Depués, convierte el total en hexa con IntToHex().

Si no son deberes, dilo y te paso algo de código, aunque debería ser bastante fácil, por no decir trivial. ;)

Por cierto, deja de ser trivial (aunque sigue siendo fácil) si la cadena es en algún tipo de Unicode: UTF-8, UnicodeString, WideChar, etc.
« Last Edit: April 15, 2021, 03:32:39 am by lucamar »
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus/FPC 2.0.8/3.0.4 & 2.0.12/3.2.0 - 32/64 bits on:
(K|L|X)Ubuntu 12..18, Windows XP, 7, 10 and various DOSes.

mav

  • Jr. Member
  • **
  • Posts: 79
Re: sumar ascii como hex
« Reply #2 on: April 15, 2021, 01:35:52 pm »
Hola, no son deberes, son ejercicios que intento hacer para aprender desde cero a mis sesenta y alguno años, es un keygenme de los que circulan por ahi que he resuelto y el algoritmo es el siguiente:
   1.- 10 o mas caracteres para nombre (no conoceriamos el tamaño del array)
   2.- Toma el primero ,el tercero y luego cada segundo número (osea va sumando los que estan en posiciones impares 1,3,5,7...etc) ,  y se guarda el resultado (siempre el hex de los ascii)
   3.- Toma el número que hemos tecleado le suma una constante que siempre es el producto
       de 19*16 = 226 en hexadecimal.El número tecleado es el que quiero hacer aparecer con el programa
   4.- Compara el resultado de esta suma con el resultado de la suma del punto 2.
       si son iguales todo bien, si no que vuelvas otra vez a intentarlo.   
..pero para mi es complejo..
Gracias por contestar
Saludos

lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: sumar ascii como hex
« Reply #3 on: April 15, 2021, 03:03:25 pm »
Vale, perdona; es que sonaba un montón como el típico ejercicio de clase.

Imagino que no quieres el problema completo resuelto, así que este código responde sólo a tu pregunta inicial, aunque tengo una pequeña duda:
Code: Pascal  [Select][+][-]
  1. { Si sólo quieres la suma, hazle devolver un Integer }
  2. function TotalEven(const sv: AnsiString): AnsiString;
  3. var
  4.   Total: Integer = 0;
  5.   i: Integer;
  6. begin
  7.   for i := 1 to Length(sv) do
  8.     if Odd(i) then Total := Total + Ord(sv[i]);
  9.   Result := Total.ToHexString(0);
  10.   {Result := Total; Si sólo quieres la suma.}
  11. end;

La duda es qué quieres decir con "usando siempre el hexa": ¿quieres decir el valor de código o la representación en hexa del mismo?

Quiero decir, aunque esté en hexadecimal un número es un número, así que puedes trabajar con él normalmente y convertir a hexa al final, para mostrarlo. Pero si te refieres a la representación en sí, como cadena ('3F', en vez de $3F o 63 decimal) las cosas cambian un poco.
« Last Edit: April 15, 2021, 03:08:13 pm by lucamar »
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus/FPC 2.0.8/3.0.4 & 2.0.12/3.2.0 - 32/64 bits on:
(K|L|X)Ubuntu 12..18, Windows XP, 7, 10 and various DOSes.

mav

  • Jr. Member
  • **
  • Posts: 79
Re: sumar ascii como hex
« Reply #4 on: April 15, 2021, 05:03:30 pm »
Tienes razón, da lo mismo sumar los caracteres, como hexadecimal, o decimal, al final se convierten en lo que deseemos.
Y no, no queria el problema entero resuelto, por eso preguntaba sólo esa parte para darme una idea de como continuar,
muchas gracias.
Si no soy capaz de continuar, preguntaré alguna cosa mas :) :) :) .
El 'armar' los loops y los arrays-matrices es lo más trabajo me está costando.
Gracias.


mav

  • Jr. Member
  • **
  • Posts: 79
Re: sumar ascii como hex
« Reply #5 on: April 15, 2021, 07:32:25 pm »
Ya lo tengo casi funcionando...
Code: Pascal  [Select][+][-]
  1.  procedure TForm1.Button1Click(Sender: TObject);
  2.     var
  3.      nombre : AnsiString;
  4.      i,temp ,R : integer ;
  5.     const
  6.      x = 550;
  7.    begin
  8.      temp:= 0;
  9.     nombre := Edit1.Text;
  10.      if length(nombre) = 0 then
  11.       begin
  12.        ShowMessage('Debes introducir un nombre');
  13.       end;
  14.          if length(nombre) < 10 then
  15.           begin
  16.            ShowMessage('El nombre debe tener 10 caracteres como mínimo')
  17.           end;
  18.      for i:= 1 to length (Edit1.Text) do
  19.       If Odd(i) then
  20.      temp := temp+ Ord(Edit1.Text[i]);
  21.      R := temp ;
  22.      Edit2.Text := IntToStr(R) - x ; ------------------------ Aqui ¿Como le resto (con signo el resultado)  a IntTostr(R) la x para que no me dè
  23.   end;                                                                Un error siempre la he 'casteado' a varios tipos pero ..siempre error
  24.  
Es lo único que me queda yá.

lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: sumar ascii como hex
« Reply #6 on: April 15, 2021, 07:34:59 pm »
Este tipo de "desafíos" resultan bastante divertidos así que no dudes en preguntar lo que sea.

Una cosa te puedo decir, por experiencia: con un poco de práctica recorrer matrices y cadenas en bucles llega a ser prácticamente automático. :)

EPA: Vaya, se han cruzado nuestros posts. Dame un minuto y respondo a tu pregunta ...

Vale, ya está. Date cuenta que IntToStr() convierte un entero en una cadena y luego estás tratando de restar a esa cadena otro entero. Haz primero las operaciones y luego convierte al final (o, en este caso, dentro de la llamada a IntToStr).

Me he tomado la libertad de reformatear el código y eliminar la variable R que no era realmente necesaria. El método quedaría así:

Code: Pascal  [Select][+][-]
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   nombre : AnsiString;
  4.   i, temp : integer ;
  5. const
  6.   x = 550;
  7. begin
  8.   temp:= 0;
  9.   nombre := Edit1.Text;
  10.   if length(nombre) = 0 then
  11.    begin
  12.      ShowMessage('Debes introducir un nombre');
  13.      Exit; {No queremos seguir en este caso}
  14.    end;
  15.   if length(nombre) < 10 then
  16.    begin
  17.      ShowMessage('El nombre debe tener 10 caracteres como mínimo')
  18.      Exit; {¡Aquí tampoco queremos seguir!}
  19.    end;
  20.   for i:= 1 to length (Edit1.Text) do
  21.     If Odd(i) then
  22.       temp := temp+ Ord(Edit1.Text[i]);
  23.   Edit2.Text := IntToStr(temp - x);
  24. end;
« Last Edit: April 15, 2021, 07:49:13 pm by lucamar »
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus/FPC 2.0.8/3.0.4 & 2.0.12/3.2.0 - 32/64 bits on:
(K|L|X)Ubuntu 12..18, Windows XP, 7, 10 and various DOSes.

mav

  • Jr. Member
  • **
  • Posts: 79
Re: sumar ascii como hex
« Reply #7 on: April 15, 2021, 08:39:04 pm »
 :) :)Bien, perfecto y el exit era algo que se necesitaba....
Saludos.

mav

  • Jr. Member
  • **
  • Posts: 79
Re: sumar ascii como hex
« Reply #8 on: April 26, 2021, 02:33:22 pm »
Hola.
Con la ñ deja de funcionar. No puede haber eñes.
¿Qué se podría hacer para incluirla?

BlueIcaro

  • Hero Member
  • *****
  • Posts: 791
    • Blog personal
Re: sumar ascii como hex
« Reply #9 on: April 26, 2021, 02:45:32 pm »
Hola.
Con la ñ deja de funcionar. No puede haber eñes.
¿Qué se podría hacer para incluirla?
Hola, porque dices que deja de funcionar con ñ, a mi me funciona.
/BlueIcaro

« Last Edit: April 26, 2021, 02:48:04 pm by BlueIcaro »

lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: sumar ascii como hex
« Reply #10 on: April 26, 2021, 03:08:52 pm »
Con la ñ deja de funcionar. No puede haber eñes.

Tendrás que especificar un poco mejor a qué te refieres con "deja de funcionar". Pero recuerda lo que dije anteriormente: con caracteres UTF8 (e.g. cualquiera que en una página "ANSI" de Windows esté por encima de #127, como las "ñ", acentuados, etc.) la solución deja de ser enteramente "trivial", dependiendo de lo que quieras exactamente.

Y las cadenas en Lazarus son UTF8 por defecto; no importa con caracteres ASCII (#0..#127) porque tienen la misma representación pero con los demás ya es harina de otro costal ...
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus/FPC 2.0.8/3.0.4 & 2.0.12/3.2.0 - 32/64 bits on:
(K|L|X)Ubuntu 12..18, Windows XP, 7, 10 and various DOSes.

mav

  • Jr. Member
  • **
  • Posts: 79
Re: sumar ascii como hex
« Reply #11 on: April 26, 2021, 03:26:01 pm »
..si ponemos una ñ o más, el calculo matemático que hace el keygen es erroneo falla al comprobarlo, sin ñ no hay problema,
 Entonces..solucionar eso es complejo ¿No?

mav

  • Jr. Member
  • **
  • Posts: 79
Re: sumar ascii como hex
« Reply #12 on: April 26, 2021, 03:36:56 pm »
¿Se podria convertir utf8 a Ascii extendido?El problema es que su valor en hex es D1( 209 decimal), pero al ser utf8 su valor es c3 91
por eso no va...

lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: sumar ascii como hex
« Reply #13 on: April 26, 2021, 03:50:27 pm »
¿Se podria convertir utf8 a Ascii extendido?

Sí, claro: El modo "básico" es usando UTF8ToAnsi(), for example:

Code: Pascal  [Select][+][-]
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   nombre : AnsiString(1252);
  4.   i, temp : integer ;
  5. const
  6.   x = 550;
  7. begin
  8.   temp:= 0;
  9.   nombre := UTF8ToAnsi(Edit1.Text);
  10.   if length(nombre) = 0 then
  11.     {...etc...}
  12. end;

O también puedes usar las funciones más específicas de conversión de la unidad lconvenconding del paquete LazUtils, como: UTF8ToCP1252 o UTF8ToISO_8859_15().
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus/FPC 2.0.8/3.0.4 & 2.0.12/3.2.0 - 32/64 bits on:
(K|L|X)Ubuntu 12..18, Windows XP, 7, 10 and various DOSes.

mav

  • Jr. Member
  • **
  • Posts: 79
Re: sumar ascii como hex
« Reply #14 on: April 26, 2021, 06:02:14 pm »
He probado con muchas codificaciones e historias ..y he llegado a la siguiente conclusión, que es la que funciona haciendo las operaciones
manualmente con la calculadora:
   En el Ascii extendido ñ =  $A4, Ñ = $A5, y la operación funciona cuando la ñ toma el valor $FFFF FFFF FFFF FFA4 es decir -92 decimal,
 que complicado, ¿Que codificación me da esto? Y por otra parte.¡Qué curioso!
   Por ejemplo : miguelitoññ da como valor válido -113 , cualquier otro no sirve
« Last Edit: April 26, 2021, 06:05:48 pm by mav »

 

TinyPortal © 2005-2018