Recent

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

mav

  • Jr. Member
  • **
  • Posts: 79
Re: sumar ascii como hex
« Reply #15 on: April 26, 2021, 06:06:44 pm »
Code: Pascal  [Select][+][-]
  1. procedure TForm1.Button1Click(Sender: TObject);
  2.   type
  3.     N1 = Type AnsiString(1252);
  4.   var
  5.      nombre : N1;
  6.      i,temp : integer ;
  7.     const
  8.      x = 550;
  9.  begin
  10.      temp:= 0;
  11.     nombre := UTF8ToISO_8859_15 (Edit1.Text);
  12.      if length(nombre) = 0 then
  13.       begin
  14.        ShowMessage('Debes introducir un nombre');
  15.        Exit;
  16.       end;
  17.          if length(nombre) < 10 then
  18.           begin
  19.            ShowMessage('El nombre debe tener 10 caracteres como minimo');
  20.            Exit;
  21.           end;
  22.      for i:= 1 to length (Edit1.Text) do
  23.       If Odd(i) then
  24.      temp := temp+ Ord(Edit1.Text[i]);
  25.      Edit2.Text := IntToStr(temp - x);
  26.   end;
  27.  
  28. end.                                                        
  29.  

No lo encuentro...

lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: sumar ascii como hex
« Reply #16 on: April 26, 2021, 06:46:38 pm »
Tienes que añadir LConvEncoding a la cláusula uses y, seguramente, el paquete LazUtils como "Paquete Requerido" (en el "Inspector de Proyecto")
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 #17 on: April 26, 2021, 07:33:40 pm »
Si, eso ya lo hice, pero el resultado es 333, no -113, no toma la ñ como valor negativo..tenias razón, lo de la ñ es tarea ardua,
pero somos cabezones...tiene que salir :D :D :D

lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: sumar ascii como hex
« Reply #18 on: April 26, 2021, 10:15:47 pm »
El problema es que el resultado de Ord() puede considerarse (desde un punto de vista amplio) como un byte sin signo, pero tú lo necesitas con signo, es decir, un ShortInt.

La única forma fácil que se me ocurre por el momento es usar el viejo truco del absolute o un registro variante, algo así como:

Code: Pascal  [Select][+][-]
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. type
  3.     N1 = Type AnsiString(1252);
  4. var
  5.    nombre : N1;
  6.    i : integer ;
  7.    c: Char;
  8.    si: ShortInt absolute c;
  9. const
  10.      x = 550;
  11. begin
  12.   { Simplified a little }
  13.   if length(nombre) < 10 then begin
  14.     if length(nombre) = 0 then
  15.       ShowMessage('Debes introducir un nombre');
  16.     else
  17.       ShowMessage('El nombre debe tener 10 caracteres como minimo');
  18.     Exit;
  19.   end;
  20.  
  21.   for i:= 1 to length (Edit1.Text) do
  22.     If Odd(i) then begin
  23.       c := Edit1.Text[i];
  24.       temp := temp + si;
  25.     end;
  26.   Edit2.Text := IntToStr(temp - x);
  27. end;

o la forma que yo prefiero (con algunas simplificaciones):

Code: Pascal  [Select][+][-]
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. type
  3.     N1 = Type AnsiString(1252);
  4.  
  5.     TCharInt = packed record
  6.       case Boolean of
  7.       True:  (AChar: Char);
  8.       False: (AShort: ShortInt);
  9.     end;
  10.  
  11. var
  12.    nombre : N1;
  13.    i. : integer ;
  14.    temp : integer = -550;
  15.    CI: TCharInt;
  16. begin
  17.   { Simplified a little }
  18.   if length(nombre) < 10 then begin
  19.     if nombre = '' then
  20.       ShowMessage('Debes introducir un nombre')
  21.     else
  22.       ShowMessage('El nombre debe tener 10 caracteres como minimo');
  23.     Exit;
  24.   end;
  25.  
  26.   {temp aquí ya vale -550 así que no hace falta restarlo después}
  27.   for i:= 1 to length (Edit1.Text) do
  28.     If Odd(i) then begin
  29.       CI.AChar := Edit1.Text[i];
  30.       temp := temp + CI.AShort;
  31.     end;
  32.   Edit2.Text := IntToStr(temp);
  33. end;
  34.  
  35. end.
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 #19 on: April 26, 2021, 10:58:39 pm »
Utilizando siempre como nombre miguelitoññ, que sabemos que el resultado es igual a -113, si usamos el primer método
nos da igual a -179 ,nos vamos acercando ¿La codificacion del string?... UTF8ToISO_8859_15 ??
El segundo método dá como resultado 371 ...?????????

lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: sumar ascii como hex
« Reply #20 on: April 26, 2021, 11:10:21 pm »
Utilizando siempre como nombre miguelitoññ, que sabemos que el resultado es igual a -113, si usamos el primer método nos da igual a -179 ,nos vamos acercando ¿La codificacion del string?... UTF8ToISO_8859_15 ??

Sí, es muy probable. Se me olvidó hacer la conversión :-[

Prueba con UTF8ToCP1252(), UT8ToCP850() o UTF8ToCP437(). O mira la especificación (si existe) de lo que sea que estés tratando de hacer ;)

Quote
El segundo método dá como resultado 371 ...?????????

Umm ... Eso sí que es raro. Ambos métodos deberían dar exactamente el mismo resultado, ya que son básicamente equivalentes. Igual me he pasado "simplificando", aunque no lo veo :-[
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 #21 on: April 27, 2021, 06:25:23 am »
Hola, buenos dias, ante todo gracias por tu tiempo y ayuda, no se si se podrá resolver el problema de la de la ñ, lo si sé es que
con tus códigos y ayudas estoy aprendiento truquitos y cosas de la programación en Pascal, adjunto un código y ejecutable en c,
que no hice yo, no sé nada de c, que funciona con la ñ y el mio de Pascal que no funciona con la ñ, como dato a las últimas versiones
de Python les sucede lo mismo que a Pascal  .
Saludos y gracias

mav

  • Jr. Member
  • **
  • Posts: 79
Re: sumar ascii como hex
« Reply #22 on: April 27, 2021, 06:26:05 am »
...el de pascal.
 Tus dos metódos dan el mismo resultado, algo hice mal la última vez que lo he probado, sorry, tengo un montón de variaciones sobre este
programa en la misma carpeta con ligeras variaciones de nombre :D :D :D
« Last Edit: April 27, 2021, 09:42:57 am by mav »

lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: sumar ascii como hex
« Reply #23 on: April 27, 2021, 12:41:10 pm »
Tus dos metódos dan el mismo resultado, algo hice mal la última vez que lo he probado, sorry, tengo un montón de variaciones sobre este programa en la misma carpeta con ligeras variaciones de nombre :D :D :D

No te preocupes, suele pasar cuando uno está haciendo pruebas de algo ;D

Ando algo líado ahora pero he descargado tus programas y les echaré un ojo en cuanto tenga algo de tiempo libre, seguramente en algún momento de la tarde, ¿vale?
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 #24 on: April 27, 2021, 01:16:31 pm »
De acuerdo, muchas gracias.
He estado 'debuggeando' el ejecutable con tu segundo código, tu código es perfecto, la cuestión es que cuando carga la ñ para sumarla con los otros caracteres 6D(m),
67(g)...etc,  en vez de cargar FFFF FFA4 (ñ)  , carga FFFF FFB1 que no tiene nada que ver con la ñ...por lo que pienso que alguna tabla del CP437 de freepascal está equivocada...

lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: sumar ascii como hex
« Reply #25 on: April 27, 2021, 02:41:13 pm »
la cuestión es que cuando carga la ñ para sumarla con los otros caracteres 6D(m), 67(g)...etc,  en vez de cargar FFFF FFA4 (ñ)  , carga FFFF FFB1 que no tiene nada que ver con la ñ...por lo que pienso que alguna tabla del CP437 de freepascal está equivocada...

No es eso, pero se parece. He estado haciendo algunas pruebas (entre bocado y bocado :)) y parece que hay alguna interacción entre las funciones de conversión, la página de la cadena, alguna conversión interna y, quizá, el tiempo en Timbuctú (o algo así).

Tras darle unas cuantas vueltas he llegado al siguiente código que parece que funciona bien; al menos da -113 para "miguelitoññ" :)

Code: Pascal  [Select][+][-]
  1. type
  2.   TCharInt = packed record
  3.     case Boolean of
  4.     True:  (AChar: Char);
  5.     False: (AShort: ShortInt);
  6.   end;
  7.  
  8. procedure TForm1.Button1Click(Sender: TObject);
  9. var
  10.   nombre: RawByteString;
  11.   i: integer ;
  12.   temp : integer = -550;
  13.   CI: TCharInt;
  14. begin
  15.   nombre := UTF8ToCP437(Edit1.Text, True);
  16.  
  17.   if length(nombre) < 10 then begin
  18.     if nombre = '' then
  19.       ShowMessage('Debes introducir un nombre')
  20.     else
  21.       ShowMessage('El nombre debe tener 10 caracteres como minimo');
  22.     Edit1.SetFocus;
  23.     Exit;
  24.   end;
  25.  
  26.   for i:= 1 to Length(nombre) do
  27.     If Odd(i) then begin
  28.       CI.AChar := nombre[i];
  29.       temp := temp + CI.AShort;
  30.     end;
  31.   Edit2.Text := Format('%d = $%0:.2x', [temp]);
  32. end;

El quid del asunto parece estar en usar RawByteString para que el compilador no añada ninguna conversión intermedia a la que hacemos nosotros con UTF8ToCP437().

Por cierto, tras examinar unas cuantas tablas de códigos las únicas que valen para esto son IBM437 e IBM850; ninguna de las de Windows (125x) o ISO-8859-x que he consultado tiene las "Ñ" en ese preciso lugar.

Te adjunto mi proyecto de prueba completo, que tiene unas cuantas cositas más para ver qué va haciendo en cada vuelta, etc.
« Last Edit: April 27, 2021, 02:46:24 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 #26 on: April 27, 2021, 04:58:50 pm »
Me has dejado sin palabras :) :), fantástico, solucionado de todo y con creces. Lo he probado con diversos nombres y todo
perfecto...
Agradecido de verdad.
Sigo programando otras cosas ahora que ya está resuelto esto...Espero alcanzar tú nivel algún día.Saludos
Hasta la próxima :) :)



lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: sumar ascii como hex
« Reply #27 on: April 27, 2021, 06:10:16 pm »
Me has dejado sin palabras :) :), fantástico, solucionado de todo y con creces. Lo he probado con diversos nombres y todo
perfecto...
Agradecido de verdad.

Bueno, para eso está el foro :)

Quote
Sigo programando otras cosas ahora que ya está resuelto esto...Espero alcanzar tú nivel algún día.Saludos
Hasta la próxima :) :)

Tampoco es para tanto; cuestión de experiencia ... :-[
;)
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.

 

TinyPortal © 2005-2018