forked from nique_372/BasesParserSLan
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));
| |
}
| |
| |
//+------------------------------------------------------------------+
|