//+------------------------------------------------------------------+ //| HexUtils.mqh | //| Copyright 2026, Niquel Mendoza. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2026, Niquel Mendoza." #property link "https://www.mql5.com" #property strict #ifndef TSNSTD_SRC_ENCODING_HEXUTILS_MQH #define TSNSTD_SRC_ENCODING_HEXUTILS_MQH //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #include //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ namespace TSN { //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CHexUtils { public: CHexUtils(void) {} ~CHexUtils(void) {} //--- // in = entrada // i = offset incial de lectura // len = tamaño de elemtnos a leer // buf = buffer de salida // w = offset en el buffer de salida // 1. No se valida si len es el que dice ser (osea si es mayor que el in.. ni nada se asume input) valido lo mismo con i\w... etc.. static int HexToBytes(const uchar& in[], int i, int len, uchar& buf[], int w = 0); static int HexToBytes(const string& in, int i, int len, uchar& buf[], int w = 0); //--- // raw = bytes // t = tamaño de los bytes // out = string de salida // raw_i = offset de lecutra de raw static void BytesToHexUpper(const uchar &raw[], int t, string& out, int raw_i = 0); static void BytesToHexLower(const uchar &raw[], int t, string& out, int raw_i = 0); }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ static int CHexUtils::HexToBytes(const uchar& in[], int i, int len, uchar &buf[], int w = 0) { //--- const int sob = len & 1; int exact_len = len - sob; const int req = (len >> 1) + sob; //--- if(ArraySize(buf) < req) ArrayResize(buf, req); //--- exact_len += i; // para que peuda empzar bien.. //--- if(sob) { buf[w++] = g_arr_valid_hex_chars[in[i++]]; exact_len++; } //--- for(; i < exact_len; i += 2) buf[w++] = (g_arr_valid_hex_chars[in[i]] << 4) | g_arr_valid_hex_chars[in[i + 1]]; //--- return w; } //+------------------------------------------------------------------+ static int CHexUtils::HexToBytes(const string &in, int i, int len, uchar &buf[], int w = 0) { //--- const int sob = len & 1; int exact_len = len - sob; const int req = (len >> 1) + sob; //--- if(ArraySize(buf) < req) ArrayResize(buf, req); //--- exact_len += i; // para que peuda empzar bien.. //--- if(sob) { buf[w++] = g_arr_valid_hex_chars[(uchar)in[i++]]; exact_len++; } //--- for(; i < exact_len; i += 2) buf[w++] = (g_arr_valid_hex_chars[(uchar)in[i]] << 4) | g_arr_valid_hex_chars[(uchar)in[i + 1]]; //--- return w; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #define MQLARTICLES_UENCODE_HEXUTILS_BYTEST \ { \ StringInit(out, t << 1, ' '); \ int w = 0; \ t+=raw_i; \ for(; raw_i < t; raw_i++) \ { \ const uchar num = raw[raw_i]; \ out.SetChar(w++,digitos[num >> 4]); \ out.SetChar(w++,digitos[num & 15]); \ } \ } //+------------------------------------------------------------------+ static void CHexUtils::BytesToHexUpper(const uchar &raw[], int t, string& out, int raw_i = 0) { //--- static const uchar digitos[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; MQLARTICLES_UENCODE_HEXUTILS_BYTEST } //+------------------------------------------------------------------+ static void CHexUtils::BytesToHexLower(const uchar &raw[], int t, string& out, int raw_i = 0) { //--- static const uchar digitos[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; MQLARTICLES_UENCODE_HEXUTILS_BYTEST } } //+------------------------------------------------------------------+ #endif // TSNSTD_SRC_ENCODING_HEXUTILS_MQH //+------------------------------------------------------------------+