This cross-platform library allows to conveniently perform byte-wise operation with structures and standard data types.
Features:
- Byte-wise comparison (== and !=) of the structures and standard data types with each other (in MQL, the operators for comparing structures are absent by default).
- Determining the byte shift of a structure filed by its name.
- Reading the value of any standard type by the byte shift in the source data.
- Writing structures and standard types by byte shift to the source data.
- Converting structures and standard data types into a byte array.
Everything mentioned applies to simple structures.
A script with detailed comments is attached to demonstrate the capabilities of the library
// MQL4&5-code #property strict #include <TypeToBytes.mqh> #define PRINT(A) ::Print(#A + " = " + (string)A); void OnStart( void ) { MqlTick Tick; ::SymbolInfoTick(::Symbol(), Tick); MqlTick CloneTick = Tick; // Operation with structures if (_R(Tick) == CloneTick) // Now the structures can be compared ::Print("Equal"); // Get the result of the required type by shift PRINT(_R(Tick)[(datetime)0]) // Check the 'datetime' value with the zero shift in the object of the MqlTick structure - Tick.time // Get the shift of the structure field const int Offset = _OFFSET(Tick, bid); // Found the shift in bytes of the bid field in the MqlTick object PRINT(Tick.bid) // Checked the value of Tick.bid _W(Tick, Offset, (double)1.23456); // Wrote the (double)1.23456 value at the found shift PRINT(Tick.bid) // Made sure that the Tick.bid is now equal to 1.23456 PRINT(_R(Tick)[(double)Offset]) // Printed the 'double' value located at the shift Offset - it is Tick.bid again PRINT(_R(Tick).Bytes[8]) // Checked the value of byte with the shift of 8 in the object of the MqlTick structure PRINT(_R(Tick)[(uchar)8]) // The same, but using a different method PRINT(CloneTick.bid) // Checked the value of CloneTick.bid _W(CloneTick, 0, Tick); // Wrote the value of the Tick structure object to the CloneTick at the zero shift PRINT(CloneTick.bid) // Made sure that CloneTick.bid == Tick.bid // Operation with the standard types color Color = C'241,248,255'; PRINT(_R(Color)[(uchar)1]) // Green component of the color - 248 _W(Color, 2, (uchar)230); // Wrote the (uchar)230 value at the shift of 2. PRINT(Color) // Made sure that Color is now C'241,248,230' // Simultaneous operation with mixed types if (_R(Tick) != Color) // It is even possible to compare structures with standard types ::Print("Not equal"); return; }