- El valor absoluto de un número
- Máximo y mínimo de dos números
- Funciones de redondeo
- Resto tras la división (operación módulo)
- Potencias y raíces
- Funciones exponenciales y logarítmicas
- Funciones trigonométricas
- Funciones hiperbólicas
- Prueba de normalidad para números reales
- Generación de números aleatorios
- Control de la codificación endian de números enteros
Control de la codificación endian de números enteros
Varios sistemas de información, a nivel de hardware, utilizan diferentes órdenes de bytes cuando representan números en la memoria. Por lo tanto, al integrar programas MQL con el «mundo exterior», en concreto, al implementar protocolos de comunicación de red o leer o escribir archivos de formatos comunes, puede ser necesario cambiar el orden de los bytes.
Los ordenadores con Windows aplican el sistema «little-endian» (empezando por el byte menos significativo), es decir, el byte más bajo va primero en la celda de memoria asignada a la variable, luego le sigue el byte con bits más altos, y así sucesivamente. La alternativa «big-endian» (empezando por el dígito más alto, el byte más significativo) se utiliza mucho en Internet. En este caso, el primer byte de la celda de memoria es el byte con los bits altos, y el último byte es el bit bajo. Este orden es similar a la forma en que escribimos los números «de izquierda a derecha» en la vida real. Por ejemplo, el valor 1234 empieza por 1, que significa miles, seguido de 2 para las centenas, 3 para las decenas y, por último, 4 (orden bajo).
Veamos el orden de bytes por defecto en MQL5. Para ello, utilizaremos el script MathSwap.mq5.
Describe un patrón de concatenación que permite convertir un entero en un array de bytes:
template<typename T>
|
Este código permite dividir visualmente el número en bytes y enumerarlos con índices del array.
En OnStart describimos la variable uint con el valor 0x12345678 (obsérvese que los dígitos son hexadecimales; en tal notación corresponden exactamente a límites de bytes: cada 2 dígitos es un byte separado). Convirtamos el número en un array y enviémoslo al log.
void OnStart()
|
La función ArrayPrint no puede imprimir números en hexadecimal, por lo que vemos su representación decimal, pero es fácil convertirlos a base 16 y asegurarse de que coinciden con los bytes originales. Visualmente, van en orden inverso: es decir, bajo el índice 0 del array está 0x78, y luego 0x56, 0x34 y 0x12. Obviamente, este orden empieza por el byte menos significativo (de hecho, estamos en el entorno Windows).
Ahora vamos a familiarizarnos con la función MathSwap, que MQL5 proporciona para cambiar el orden de los bytes.
integer MathSwap(integer value)
La función devuelve un entero en el que se invierte el orden de los bytes del argumento pasado. La función toma parámetros del tipo ushort/uint/ulong (es decir, de 2, 4, 8 bytes de tamaño).
Probemos la función en acción:
const uint ui = 0x12345678;
|
He aquí el resultado:
12345678 -> 78563412
|
Intentemos registrar un array de bytes después de convertir el valor 0x12345678 con MathSwap:
bo = MathSwap(ui); // put the result of MathSwap into ByteOverlay
|
En un byte con índice 0, donde antes había 0x78, ahora hay 0x12, y en elementos con otros números, los valores también se intercambian.