
En estos días recordé mis épocas universitarias, lo que me llevo a experimentar de nueva cuenta con conceptos de programación a bajo nivel.
Normalmente, usamos ABAP a un nivel muy alto, pensemos en RAP, por ejemplo. De vez en cuando, sin embargo, puede ser útil recordar los conceptos básicos absolutos. Usando el ejemplo de los objetos de datos elementales, veamos la base absoluta de todo el procesamiento de datos y descendamos a los bits y bytes. Esto puede ser útil para una mejor comprensión de cómo manejar los datos en ABAP, incluida una comprensión profunda de los castings y las conversiones.
Objetos de datos y el significado de sus tipos de datos
Después de la declaración, un objeto de datos es utilizable en su contexto (procedimiento, clase, programa) según su tipo. Por ejemplo, a un objeto de datos numéricos se le puede asignar el resultado de un cálculo:

Después de esta asignación, la variable NUMERO contiene el valor calculado 6, que también se muestra en consecuencia con una salida compatible con el tipo, como por ejemplo, cl_demo_output=>display. Y por supuesto, lo mismo se puede ver en la visualización de la variable en el debug:

El DEBUG también muestra el valor hexadecimal 06000000. Esto representa directamente el valor binario 1100 0000 0000 0000 0000 0000 000 almacenado en los 4 bytes asignados al número entero de 4 bytes en la memoria. Este valor depende de la plataforma y para los tipos numéricos se define por el orden de los bytes, donde el byte más significativo (big endian) o el menos significativo (little endian) se escribe en la primera ubicación de memoria. El valor decimal del valor hexadecimal 06000000 que se muestra aquí sería 100663296 y no es el valor entero 6 con el que trata ABAP. Esto muestra el significado de los tipos de datos.
Un objeto de datos es una secuencia de bytes almacenados en la memoria , que es interpretada por el compilador en tiempo de ejecución ABAP según el tipo de datos. El valor hexadecimal es en la mayoría de los casos irrelevante para el programador.
Consideremos ahora un texto similar a un carácter con una longitud de dos caracteres:

Una vez más, es el tipo de datos el que deriva el valor 13 del contenido hexadecimal real, que es 31003300 como en el ejemplo anterior. En este caso, 31003300 es la codificación de la cadena 13 en la representación de caracteres Unicode UCS-2, que es compatible con ABAP en los sistemas Unicode. La representación de caracteres Unicode también depende del orden de bytes que depende de la plataforma.
Solo para un tipo de datos de tipo byte, el valor interpretado por ABAP corresponde directamente al contenido hexadecimal. Las siguientes líneas modifican los bits de una cadena de bytes hexadecimal con una operación de bits:

En los ejemplos anteriores, objetos de datos que ocupan 4 bytes en la memoria que tienen el mismo valor hexadecimal 31003300(valor binario 110001000000000011001100000000) .ABAP los maneja de manera diferente debido a su tipo de datos. El tipo de datos también es responsable del hecho de que se puedan aplicar diferentes tipos de operaciones (cálculo numérico, concatenación de cadenas, operación de bits) a los objetos de datos respectivos. Usando estos ejemplos.
Ahora podemos ver los conceptos básicos de conversión y conversión de tipo y su relación con bits y bytes.
Casting
En ABAP, el término casting no significa más que tratar un objeto de datos de acuerdo con un tipo de datos diferente al que se le asigna de forma permanente. Esto se puede hacer usando FIELD-SYMBOLS, con los que se puede definir un nuevo nombre (simbólico) y un nuevo tipo para el área de memoria de un objeto de datos. Cuando se accede al área de memoria utilizando un FIELD-SYMBOLS, se maneja de acuerdo con el tipo de FIELD-SYMBOL. Las siguientes líneas muestran un ejemplo.
DATA VL_HEX TYPE X LENGTH 4 VALUE '31003300'.
FIELD-SYMBOLS: <VL_NUM> TYPE I,
<VL_TEXT> TYPE C.
ASSIGN VL_HEX TO <VL_NUM> CASTING.
ASSIGN VL_HEX TO <VL_TEXT> CASTING.
CL_DEMO_OUTPUT=>NEW( )->WRITE_DATA( VL_HEX )->WRITE_DATA( <VL_NUM>
)->WRITE_DATA( <VL_TEXT> )->DISPLAY( ).
La cadena de bits en hexadecimal se convierte en un campo numérico cuando se accede con el nombre <VL_num> y en un campo de texto cuando se accede con el nombre <VL_text>. Las salidas son 31003300-13-3342385, mostrando claramente el efecto del tipo de datos en el manejo de un mismo contenido hexadecimal.


Conversión
Por el contrario, en una conversión de tipo (o conversión para abreviar), el contenido binario real de un objeto de datos se convierte para que se ajuste a otro tipo de datos. Las conversiones de tipo generalmente ocurren en asignaciones entre objetos de datos de diferentes tipos de datos. El objetivo de dicha conversión es preservar el significado específico del tipo del contenido en el campo de origen en la medida de lo posible para el tipo de datos del campo de destino. Para este propósito, ABAP contiene un gran conjunto de reglas de conversión. Un ejemplo simple se muestra aquí:
TYPES TY_HEX TYPE X LENGTH 4.
FIELD-SYMBOLS: <FS_HEX_TEXT> TYPE TY_HEX,
<FS_HEX_NUM> TYPE TY_HEX.
DATA: VL_TEXT TYPE C LENGTH 4 VALUE '12',
VL_NUM TYPE I.
VL_NUM = VL_TEXT.
ASSIGN VL_TEXT TO <FS_HEX_TEXT> CASTING.
ASSIGN VL_NUM TO <FS_HEX_NUM> CASTING.
CL_DEMO_OUTPUT=>NEW( )->WRITE_DATA( VL_TEXT )->WRITE_DATA( <FS_HEX_TEXT>
)->WRITE_DATA( VL_NUM
)->WRITE_DATA( <FS_HEX_NUM> )->DISPLAY( ).
Estamos asignando el texto de campo similar a un carácter al número de campo numérico y mostramos el resultado, que también se puede verificar en el Debug ABAP.

En ejecución ABAP reconoce que la cadena de caracteres 12 se puede interpretar como el número entero 12, genera el valor hexadecimal 0C000000 en el que este número se codifica para el tipo numérico vl_num y lo asigna a la ubicación de memoria de vl_num. Así, la conversión real tiene lugar para el contenido hexadecimal original 31003200 del texto ,al nuevo contenido hexadecimal 0C000000 del vl_núm. FIELD-SYMBOL <fs_hex_text> y <fs_hex_num> se utilizan para mostrar el contenido hexadecimal de los campos vl_text y vl_num transformándolos en un tipo similar a un byte.
Nota
Por razones de simplicidad, este blog está restringido a variables elementales . Tener en cuenta que, en particular, lo mismo se aplica a los literales que se manejan internamente como si fueran constantes del tipo de datos asignado al literal. En el ejemplo anterior, el texto se puede reemplazar por un literal '12' que arroja los mismos resultados.
Comments