22 Votos

Delphi/Lazarus: Mostrar Array de Bytes como Cadena de Valores HEX

Consejo de Stefan Trost | Última actualización el 18/02/2023 | Creado el 02/04/2021

Cuando se trabaja con Byte Arrays, tarde o temprano surge la cuestión de la visualización. Aquí tiene sentido generar los bytes individuales en forma hexadecimal como una cadena (string) para luego mostrar esta cadena al usuario, por ejemplo, en un campo de memo o mediante un mensaje. En este consejo, quiero mostrarle una función que hace precisamente eso.

En el ejemplo, usamos la siguiente definición de una matriz de bytes:

type
  TByteArr = array of Byte;

Función para convertir Matrices de Bytes en Cadenas Hexadecimales

Para visualizar matrices de bytes de este tipo en una cadena, usamos la siguiente función. La función recorre la matriz de bytes pasada como primer parámetro byte por byte y convierte cada valor de byte individual a su valor hexadecimal correspondiente:

function ByteArrayToHexString(AByteArray: TByteArr; ASep: string = ''): string;
var
  i, k: integer;
begin
  result := '';

  if ASep = '' then begin
     for i := low(AByteArray) to high(AByteArray) do 
       result := result + IntToHex(AByteArray[i], 2);
  end else begin
     k := high(AByteArray);
     for i := low(AByteArray) to k do begin
        result := result + IntToHex(AByteArray[i], 2);
        if k <> i then result := result + ASep;
     end;
  end;
end; 

La función se puede llamar con solo una matriz de bytes u, opcionalmente, con un separador como segundo parámetro, que se escribe entre los bytes individuales para una mayor claridad y legibilidad. Hemos establecido este separador en una cadena vacía de forma predeterminada en la función, de modo que cuando se llama a la función con un solo parámetro, no se escribe ningún separador entre los bytes individuales.

Ejemplo de llamada de la Función

Veamos un ejemplo de cómo podemos usar la función presentada:

var
  BA: TByteArr;
  s: string;
begin
  SetLength(BA, 4);
  BA[0] := 65;
  BA[1] := $41;
  BA[2] := %1000001; // esto solo funciona en Lazarus
  BA[3] := ord('A');

  s := ByteArrayToHexString(BA);        // 41414141
  s := ByteArrayToHexString(BA, ' ');   // 41 41 41 41
end;

En este ejemplo, primero creamos una matriz de bytes de 4 bytes de longitud y luego la llenamos con algunos valores. Luego usamos nuestra función para generar estos valores.

Incluso si hemos asignado valores "diferentes" a los elementos individuales de la matriz, cada elemento de la matriz tiene el mismo valor después del llenado. Acabamos de escribir el valor hexadecimal "41" de diferentes maneras: una vez como un valor decimal (65), una vez como un valor binario (1000001) y una vez llamando a la función ord('A'), que nos da el valor ASCII de la letra "A", que también es 65 o #41.

Cargar y Guardar Matriz de Bytes

En este contexto, también es interesante cómo cargar o guardar una matriz de bytes de respectivamente a un archivo. Puede obtener más información sobre esto en el tutorial vinculado, que muestra funciones y ejemplos para ambos casos.

ResponderPositivoNegativo

Sobre el Autor

AvatarPuede encontrar software de Stefan Trost en la pagina es.sttmedia.com. ¿Necesita un software individual según sus propios requisitos? Escribenos: es.sttmedia.com/contacto
Ver Perfil

 

Temas Relacionados

Aviso Importante

Por favor tenga en cuenta: Las contribuciones publicadas en askingbox.com son contribuciones de los usuarios y no deben reemplazar el asesoramiento profesional. No son verificados por independientes y no reflejan necesariamente la opinión de askingbox.com. Aprende más.

Participar

Haga su propia pregunta o escriba su propio artículo en askingbox.com. He aquí cómo.