Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Verificar cadena es Hexadecimal (https://www.clubdelphi.com/foros/showthread.php?t=65088)

yapt 19-11-2009 12:03:23

Verificar cadena es Hexadecimal
 
Hola a todos,

estoy desarrollando una clase de calculo de CRC y necesito una ayudita.

Para calcular el CRC, solicito una cadena de longitud X, pero que hay que pasar en HEXadecimal.

Lo que necesito es una rutina, rápida, que chequee que todos los carácteres del string están en el rango Hexadecimal (0..9,A..F).

La cadena, puede ser de cualquier longitud. Y se trata de no "cargar" la clase con librerias externas, etc...

De momento, lo he hecho así:
Cita:

result := false, //error;
for x := 0 to (length(cadena)-1 do
if not TryStrToInt('$'Cadena[x],basura) then exit;
result := true; // ok.
Gracias.

Neftali [Germán.Estévez] 19-11-2009 12:26:37

Puedes utilizar la función que viene con Delphi:
Código Delphi [-]
  function HexToBin(Text, Buffer: PChar; BufSize: Integer): Integer

Aunque no te haga falta esa conversión explícita, en la ayuda de esta función dice:

//------------------------------------------------------------------------
...
HexToBin returns the number of characters in Buffer that have not been used because Text did not contain valid hexadecimal characters ('0'..'f').
//------------------------------------------------------------------------

yapt 19-11-2009 12:41:39

La nota de la ayuda, me frena de utilizar la función que me indicas, porque tendría que chequear previamente todos los carácteres o hacer una conversión a lowercase.
Cita:

Note: The hexadecimal number must use lower-case characters; HexToBind does not recognize upper-case characters.
De momento, creo que voy a mantener la forma de verificación que ya tengo. Gracias Neftalí...

Alguna idea más ?

gerardus 19-11-2009 13:29:23

Hola,

En Delphi, las cadenas de caracteres empiezan con un indice de uno.
En vez de

Código:

for x := 0 to (length(cadena)-1 do
Tendrias que usar

Código:

for x := 1 to length(cadena) do
Si funciona tal como está, es por suerte, y dejas de comprobar el ultimo caracter.

Esta és aún más rápida (Te ahoras las conversiones de TryStrToInt):

Código:

 
  Result := false;
  for x := 1 to length(cadena) do
    if not (Cadena[x] in ['0'..'9','a'..'f','A'..'F']) then exit;
  result := true;

Cordialmente,

Gerard.

yapt 19-11-2009 16:37:51

El código no estaba probado todavía. Un despiste. Gracias gerardus.

Me gusta más tu código. Lo cambio.

Muchas gracias de nuevo y un saludo.


La franja horaria es GMT +2. Ahora son las 17:36:24.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi