154 lines
3.9 KiB
MQL5
154 lines
3.9 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| Test2.mq5 |
| |||
//| Copyright 2026, Niquel Mendoza. |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------+
| |||
#property copyright "Copyright 2026, Niquel Mendoza."
| |||
#property link "https://www.mql5.com"
| |||
#property version "1.00"
| |||
#property strict
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
char Utf32_8Len6(uint v)
| |||
{
| |||
return v < 0x80 ? 1 : (v < 0x800 ? 2 : (v < 0x10000 ? 3 : 4));
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
void Utf32to8(const uint& in[], uchar& out[])
| |||
{
| |||
//---
| |||
int w = 0;
| |||
int req = ArraySize(in) << 2;
| |||
if(req > ArraySize(out))
| |||
ArrayResize(out, req);
| |||
| |||
| |||
//---
| |||
for(int i = 0; i < ArraySize(in); i++)
| |||
{
| |||
const uint v = in[i];
| |||
switch(Utf32_8Len6(v))
| |||
{
| |||
case 1:
| |||
{
| |||
out[w++] = uchar(v);
| |||
break;
| |||
}
| |||
case 2:
| |||
{
| |||
out[w++] = uchar(0xC0 | (v >> 6));
| |||
out[w++] = uchar(0x80 | (v & 0x3f));
| |||
break;
| |||
}
| |||
case 3:
| |||
{
| |||
out[w++] = uchar(0xE0 | (v >> 12));
| |||
out[w++] = uchar(0x80 | ((v >> 6) & 0x3f));
| |||
out[w++] = uchar(0x80 | (v & 0x3f));
| |||
break;
| |||
}
| |||
case 4:
| |||
{
| |||
out[w++] = uchar(0xF0 | (v >> 18));
| |||
out[w++] = uchar(0x80 | ((v >> 12) & 0x3F));
| |||
out[w++] = uchar(0x80 | ((v >> 6) & 0x3F));
| |||
out[w++] = uchar(0x80 | (v & 0x3F));
| |||
break;
| |||
}
| |||
default:
| |||
break;
| |||
}
| |||
}
| |||
}
| |||
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
void Utf32to82(const uint& in[], uchar& out[])
| |||
{
| |||
//---
| |||
int w = 0;
| |||
int req = ArraySize(in) << 2;
| |||
if(req > ArraySize(out))
| |||
ArrayResize(out, req);
| |||
| |||
//---
| |||
for(int i = 0; i < ArraySize(in); i++)
| |||
{
| |||
const uint v = in[i];
| |||
if(v < 0x80)
| |||
{
| |||
out[w++] = uchar(v);
| |||
}
| |||
else
| |||
if(v < 0x800)
| |||
{
| |||
out[w++] = uchar(0xC0 | (v >> 6));
| |||
out[w++] = uchar(0x80 | (v & 0x3f));
| |||
}
| |||
else
| |||
if(v < 0x10000)
| |||
{
| |||
out[w++] = uchar(0xE0 | (v >> 12));
| |||
out[w++] = uchar(0x80 | ((v >> 6) & 0x3f));
| |||
out[w++] = uchar(0x80 | (v & 0x3f));
| |||
}
| |||
else
| |||
{
| |||
out[w++] = uchar(0xF0 | (v >> 18));
| |||
out[w++] = uchar(0x80 | ((v >> 12) & 0x3F));
| |||
out[w++] = uchar(0x80 | ((v >> 6) & 0x3F));
| |||
out[w++] = uchar(0x80 | (v & 0x3F));
| |||
}
| |||
| |||
}
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Script program start function |
| |||
//+------------------------------------------------------------------+
| |||
void OnStart()
| |||
{
| |||
//---
| |||
#define SIZE (8192)
| |||
| |||
//---
| |||
MathSrand(16551);
| |||
uint32_t in[];
| |||
ArrayResize(in, SIZE);
| |||
for(int i = 0; i < SIZE; i++)
| |||
{
| |||
in[i] = MathRand();
| |||
}
| |||
| |||
//---
| |||
uchar out[];
| |||
uchar o2[];
| |||
| |||
//---
| |||
ulong a = GetMicrosecondCount();
| |||
for(int i = 0; i < 10000; i++)
| |||
{
| |||
Utf32to8(in, out);
| |||
}
| |||
ulong b = GetMicrosecondCount();
| |||
Print("time: ", (b - a), " ", ArrayMaximum(out));
| |||
| |||
| |||
//---
| |||
a = GetMicrosecondCount();
| |||
for(int i = 0; i < 10000; i++)
| |||
{
| |||
Utf32to8(in, o2);
| |||
}
| |||
b = GetMicrosecondCount();
| |||
Print("time: ", (b - a), " ", ArrayMaximum(o2));
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
|