Header Ads Widget

Ticker

6/recent/ticker-posts

JDK 17: Formato y análisis hexadecimal

 La compilación 3 de las compilaciones de acceso anticipado de JDK 17 incluye la implementación de JDK-8251989 (“utilidad de formato y análisis hexadecimal”). Esta funcionalidad recién introducida para analizar y formatear valores hexadecimales está encapsulada en la nueva clase java.util.HexFormaty es el tema de esta publicación.

Ejecutar javap contra la nueva java.util.HexFormatclase proporciona una manera fácil de ver una descripción general de su API. La siguiente salida se genera a partir de la ejecución javap java.util.HexFormat:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
dieciséis
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Compiled from "HexFormat.java"
public final class java.util.HexFormat {
  static final boolean $assertionsDisabled;
  public static java.util.HexFormat of();
  public static java.util.HexFormat ofDelimiter(java.lang.String);
  public java.util.HexFormat withDelimiter(java.lang.String);
  public java.util.HexFormat withPrefix(java.lang.String);
  public java.util.HexFormat withSuffix(java.lang.String);
  public java.util.HexFormat withUpperCase();
  public java.util.HexFormat withLowerCase();
  public java.lang.String delimiter();
  public java.lang.String prefix();
  public java.lang.String suffix();
  public boolean isUpperCase();
  public java.lang.String formatHex(byte[]);
  public java.lang.String formatHex(byte[], int, int);
  public <A extends java.lang.Appendable> A formatHex(A, byte[]);
  public <A extends java.lang.Appendable> A formatHex(A, byte[], int, int);
  public byte[] parseHex(java.lang.CharSequence);
  public byte[] parseHex(java.lang.CharSequence, int, int);
  public byte[] parseHex(char[], int, int);
  public char toLowHexDigit(int);
  public char toHighHexDigit(int);
  public <A extends java.lang.Appendable> A toHexDigits(A, byte);
  public java.lang.String toHexDigits(byte);
  public java.lang.String toHexDigits(char);
  public java.lang.String toHexDigits(short);
  public java.lang.String toHexDigits(int);
  public java.lang.String toHexDigits(long);
  public java.lang.String toHexDigits(long, int);
  public boolean isHexDigit(int);
  public int fromHexDigit(int);
  public int fromHexDigits(java.lang.CharSequence);
  public int fromHexDigits(java.lang.CharSequence, int, int);
  public long fromHexDigitsToLong(java.lang.CharSequence);
  public long fromHexDigitsToLong(java.lang.CharSequence, int, int);
  public boolean equals(java.lang.Object);
  public int hashCode();
  public java.lang.String toString();
  static {};
}

La lista generada por javap que se muestra arriba indica que hay dos staticmétodos de fábrica para obtener una instancia de HexFormatHexFormat.of()HexFormat.ofDelimiter(String)Ambos métodos de fábrica especifican instancias de HexFormatcon "parámetros preestablecidos". El resto de los publicmétodos son métodos de instancia que se utilizan generalmente para una de las cinco categorías de acción:

  • Indique a la HexFormatinstancia que aplique parámetros diferentes a los parámetros preestablecidos con los que se creó la instancia
  • Indicar parámetros configurados de HexFormatinstancia
  • Convertir ay desde representaciones hexadecimales
  • Indicar características de personajes y secuencias de caracteres
  • Se reemplaza Objectmétodos: toString()equals(Object),hashCode()

El Javadoc de nivel de clase para HexFormat's resume los propósitos de la HexFormatclase en una sola oración: " HexFormatconvierte entre bytes y caracteres y cadenas codificadas en hexadecimal que pueden incluir marcas de formato adicionales, como prefijos, sufijos y delimitadores". Esa documentación basada en Javadoc de nivel de clase también proporciona ejemplos útiles de cómo aplicar la HexFormatclase para ocultar entre estos tipos y aplicar prefijos, sufijos y delimitadores. La documentación a nivel de clase explica además que la HexFormatclase es "inmutable y segura para subprocesos" y es una " clase basada en valores ".

En la última versión del HexFormat código fuente de la clase que vi, se anunciaba " @since 16 ", que es una prueba del trabajo que se ha invertido en esta clase en términos de implementación, revisión y comentarios incorporados (el 33 comete es otra prueba). El lanzamiento oficial de HexFormates en realidad JDK 17 , pero la documentación de la API de acceso anticipado de JDK 17 todavía muestra " @since 16 " al momento de escribir este artículo.

En esta publicación, proporciono algunos ejemplos simples de aplicación HexFormaty estas listas de códigos están disponibles en GitHub . Afortunadamente, la documentación de la API basada en Javadoc a nivel de clase proporciona muy buenos ejemplos de aplicación HexFormatMe gusta cuando el Javadoc de las clases muestra ejemplos de cómo aplicar esas clases y la HexFormatdocumentación hace un buen trabajo al cubrir muchos aspectos del uso de esa clase. Mis ejemplos cubrirán una porción más pequeña de la API de la clase y están pensados ​​únicamente como una introducción a la disponibilidad básica de esta clase.

Adquirir una instancia de HexFormat

Hay dos staticmétodos para adquirir una instancia de HexFormaty uno de ellos se demuestra aquí:

1
2
/** Instance of {@link HexFormat} used in this demonstration. */
private static final HexFormat HEX_FORMAT_UPPER_CASE = HexFormat.of().withUpperCase();

El withUpperCase()método indica a la instancia de HexFormatque "use caracteres hexadecimales en mayúsculas" ("0-9", "AF").

Convertir enteros a hexadecimales

El fragmento de código que se muestra a continuación demuestra el uso de HexFormat.toHexDigits():

01
02
03
04
05
06
07
08
09
10
11
/**
 * Demonstrates use of {@link HexFormat#toHexDigits(int)}.
 */
public void demoIntegerToHexadecimal()
{
   for (int integerValue = 0; integerValue < 17; integerValue++)
   {
      out.println("Hexadecimal representation of integer " + integerValue + ": '"
         + HEX_FORMAT_UPPER_CASE.toHexDigits(integerValue) + "'.");
   }
}

Cuando se ejecuta el fragmento de código anterior, el resultado se ve así:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
dieciséis
17
Hexadecimal representation of integer 0: '00000000'.
Hexadecimal representation of integer 1: '00000001'.
Hexadecimal representation of integer 2: '00000002'.
Hexadecimal representation of integer 3: '00000003'.
Hexadecimal representation of integer 4: '00000004'.
Hexadecimal representation of integer 5: '00000005'.
Hexadecimal representation of integer 6: '00000006'.
Hexadecimal representation of integer 7: '00000007'.
Hexadecimal representation of integer 8: '00000008'.
Hexadecimal representation of integer 9: '00000009'.
Hexadecimal representation of integer 10: '0000000A'.
Hexadecimal representation of integer 11: '0000000B'.
Hexadecimal representation of integer 12: '0000000C'.
Hexadecimal representation of integer 13: '0000000D'.
Hexadecimal representation of integer 14: '0000000E'.
Hexadecimal representation of integer 15: '0000000F'.
Hexadecimal representation of integer 16: '00000010'.

Demostrando HexFormat.isHexDigit(int)

El siguiente código demuestra HexFormat.isHexDigit(int):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
dieciséis
/**
 * Demonstrates use of {@link HexFormat#isHexDigit(int)}.
 */
public void demoIsHex()
{
   for (char characterValue = 'a'; characterValue < 'i'; characterValue++)
   {
      out.println("Is character '" + characterValue + "' a hexadecimal value? "
         + HEX_FORMAT_UPPER_CASE.isHexDigit(characterValue));
   }
   for (char characterValue = 'A'; characterValue < 'I'; characterValue++)
   {
      out.println("Is character '" + characterValue + "' a hexadecimal value? "
         + HEX_FORMAT_UPPER_CASE.isHexDigit(characterValue));
   }
}

Aquí está el resultado de ejecutar el fragmento de código anterior:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
dieciséis
Is character 'a' a hexadecimal value? true
Is character 'b' a hexadecimal value? true
Is character 'c' a hexadecimal value? true
Is character 'd' a hexadecimal value? true
Is character 'e' a hexadecimal value? true
Is character 'f' a hexadecimal value? true
Is character 'g' a hexadecimal value? false
Is character 'h' a hexadecimal value? false
Is character 'A' a hexadecimal value? true
Is character 'B' a hexadecimal value? true
Is character 'C' a hexadecimal value? true
Is character 'D' a hexadecimal value? true
Is character 'E' a hexadecimal value? true
Is character 'F' a hexadecimal value? true
Is character 'G' a hexadecimal value? false
Is character 'H' a hexadecimal value? false

Demostrando HexFormat.toString()

La HexFormatclase proporciona una versión anulada del Object.toString()método y esto se demuestra en el siguiente fragmento de código y el resultado correspondiente de la ejecución de ese fragmento de código.

01
02
03
04
05
06
07
08
09
10
11
12
/**
 * Demonstrates string representation of instance of
 * {@link HexFormat}.
 *
 * The {@link HexFormat#toString()} method provides a string
 * that shows the instance's parameters (not class name):
 * "uppercase", "delimiter", "prefix", and "suffix"
 */
public void demoToString()
{
   out.println("HexFormat.toString(): " + HEX_FORMAT_UPPER_CASE);
}
1
HexFormat.toString(): uppercase: true, delimiter: "", prefix: "", suffix: ""

Otros ejemplos de HexFormat

La documentación a nivel de clase basada en Javadoc HexFormatcontiene más ejemplos de cómo aplicar esta clase. Los ejemplos demuestran métodos de instanciación HexFormat.of()HexFormat.ofDelimiter(String)demostrar métodos de utilidad toHexDigit(byte)fromHexDigits(CharSequence)formatHex(byte[]), y parseHex(String)y demostrar métodos de especialización de instancias withUpperCase()withPrefix(String)Me gusta que los últimos ejemplos sean ejemplos "realistas" de cómo se pueden usar las operaciones en situaciones prácticas (como con huellas dactilares de bytes ).

Usos de JDK de HexFormat

El JDK y sus pruebas ya se utilizan HexFormat . Los siguientes son algunos ejemplos de esto.

Publicar un comentario

0 Comentarios