Ваш класс Malicious
вообще не определил никакого конструктора, и из документов MSDN по использованию конструкторов
Если класс не является статическим, классы без конструкторы получают открытый конструктор по умолчанию от компилятора C #, чтобы включить создание экземпляров класса.
Это означает, что ваш класс имеет:
public class Malicious : MaliciousSmall
{
public Malicious()
{
}
}
В производном классе, если базовый Конструктор класса не вызывается явно с помощью ключевого слова
base
, конструктор по умолчанию, если он есть, называется неявно .
Это фактически означает:
public Malicious() :base() //implicitly calling base class constructor
Так как ваш базовый класс не имеет конструктора по умолчанию (без параметра) , вы получите ошибку.
Теперь у вас есть две возможности исправить эту ошибку.
Вероятно, для вашей ситуации лучше вызывать базовый конструктор явно, поскольку оба конструктора получают один и тот же параметр типа. Вы можете сделать:
public Malicious(DataRow row) :base(row)
использовать операторы битового сдвига в сочетании с побитовыми операторами И и ИЛИ ...
предполагая 32-битное беззнаковое:
int value = 303;
int result = 0x00000000;
for (int i = 0; i < 4; i++)
{
result = result | ((value & (0xFF << (i * 8))) << (24 - (i * 8)));
}
Big-endian и little-endian относятся к порядку байтов в памяти. Такое значение, как 0x2f100000, не имеет внутреннего порядка байтов, порядок байтов зависит от архитектуры ЦП.
Если вы всегда хотите изменить порядок байтов в 32-битном значении, используйте код, опубликованный Деми.
Если вы всегда хотите изменить порядок байтов в 32-битном значении. хотите получить определенный порядок байтов (потому что вы готовитесь передать эти байты по сети или сохранить их в файл на диске), используйте что-нибудь еще. Например, в библиотеке сокетов BSD есть функция htonl (), которая берет собственное 32-битное значение вашего процессора и помещает его в порядок прямого байта.
Если вы работаете на машине с прямым порядком байтов, htonl (303) == 0x2f100000. Если вы работаете на машине с прямым порядком байтов, htonl (303) == 303. В обоих случаях результат будет представлен байтами [0x00, 0x00, 0x01, 0x2f] в памяти.
Если кто-нибудь может указать конкретный термин для того, что я пытался сделать, я все равно хотел бы его услышать. Однако я нашел способ сделать то, что мне было нужно, и я отправлю его здесь, чтобы, если кто-нибудь придет за мной, они могут его найти. Может быть (возможно, есть) более простой и прямой способ сделать это, но вот что я в итоге сделал в VB.Net, чтобы вернуть желаемый байт-код:
Private Function Encode(ByVal original As Integer) as Byte()
Dim twofiftysixes As Integer = CInt(Math.Floor(original / 256))
Dim sixteens As Integer = CInt(Math.Floor((original - (256 * twofiftysixes)) / 16))
Dim ones As Integer = original Mod 16
Dim bytecode As Byte() = {CByte((16 * sixteens) + ones), CByte(twofiftysixes), 0, 0}
Return bytecode
End Function
Фактически разбив целое число на его шестнадцатеричные компоненты, затем преобразование соответствующих пар в cBytes.