Работа с HEX

Генератор поддерживает возможность использования блока HEX-END. В основном акцентируется работа для хранения данных ( буфера ). Всего таких методов три, и дополнительно один для персональной настройки блока.

Для использования достаточно вызвать метод hex. Если передать 1 параметр, то генератор создает блок с указанным количеством байт. Если 2, то будет создан блок с количеством строк и колонок:

[Thread]
public void TEST() {
    comment = "1 parameter:";
    hex( 10 );
    comment = "2 parameters:";
    hex( 6, 3 );
}

Разница в основном заключается только в форматировании блока. Вот так получится в результате:

//------------- TEST ---------------

:TEST
03A4: name_thread 'TEST'

/* 1 parameter: */
hex
00 00 00 00 00 00 00 00 00 00 
end

/* 2 parameters: */
hex
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 00 00 
end

Если данные нужно както структурировать, то можно указать конкретный тип данных, при этом он должен сам быть структурой и иметь открытые поля с данными, которые будут использованы для вычисления размера. В параметре указывается количество таких структур:

public struct HexSctruct {
    public int min;
    public int max;
    public double range;   // он же Float
    public string vstring; // он же vString
    public char sstring;   // он же sString
    public bool anyBool;
    public byte anyByte;
    public short anyShort;
    public Car currentCar; // любой класс будет иметь размер 4 байта
}

[Thread]
public void TEST() {

    hex<HexSctruct>( 2 );

}

Генератор подсчитает смещение между данными и структурами, что в итоге приведёт к этому:

//------------- TEST ---------------

:TEST
03A4: name_thread 'TEST'
hex

// --------------------------------------------------- Struct #0 offset: +0
00 00 00 00                                         // +0 [int,uint,float]
00 00 00 00                                         // +4 [int,uint,float]
00 00 00 00                                         // +8 [int,uint,float]
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00     // +12 [vString,string]
00 00 00 00 00 00 00 00                             // +28 [sString,char]
00                                                  // +36 [byte,bool,sbyte]
00                                                  // +37 [byte,bool,sbyte]
00 00                                               // +38 [short,ushort]
00 00 00 00                                         // +40 [handle]

// --------------------------------------------------- Struct #1 offset: +44
00 00 00 00                                         // +0 [int,uint,float]
00 00 00 00                                         // +4 [int,uint,float]
00 00 00 00                                         // +8 [int,uint,float]
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00     // +12 [vString,string]
00 00 00 00 00 00 00 00                             // +28 [sString,char]
00                                                  // +36 [byte,bool,sbyte]
00                                                  // +37 [byte,bool,sbyte]
00 00                                               // +38 [short,ushort]
00 00 00 00                                         // +40 [handle]

end

Поддерживаются следующие типы данных:

РазмерОсновные типыАльтернативные типы
1byte, boolsbyte
2shortushort
4int, double, Variableuint, любой класс или структура
8sStringchar
16vStringstring

Если в блоке нужно выполнять ассемблерные вставки или другой код, то нужно указать в параметре строку с содержимым:

[Thread]
public void TEST() {

    hex( @"
04 00 02 0800 04 01
04 00 02 $PLAYER_CHAR 01 @get_offset
" );

}

Всё это будет без изменений использовано генератором:

//------------- TEST ---------------

:TEST
03A4: name_thread 'TEST'

hex
04 00 02 0800 04 01
04 00 02 $PLAYER_CHAR 01 @get_offset
end

Это одно из немногих мест, где генератор не проводит проверку валидации, поэтому использовать возможность нужно аккуратно и с умом.