У меня есть исходный код C кейгена для генерации «Master Codes» для заблокированных BIOS BIOS.Код порта C на C#. Проблемы с указателями
Пробовал усердно, трудно понять его и получил различные результаты после многих недель чтения и запроса.
Однако есть много вещей, которые я не знаю, как писать их в коде C#, который является моей целью, для приключений и академических целей.
Например, я сказать unsigned char outData[16]
на С
В C# я переписал это следующим образом:
byte* outData = stackalloc byte[16];
К таким образом, значение байта, сохраненное на C# имеет тот же размер на ОЗУ в виде неподписанные символ на C (на основе http://bytes.com/topic/c-sharp/answers/658913-unsigned-char)
Тогда я могу сделать следующее в C#:
int* testPointer = (int*) outData;
*testPointer = 0x67452301;
Сделав это, я изменил позиции 0, 1, 2 и 3 outData (байт представляет собой четверть int на C# (8 бит против 32 бит), то же отношение, что и unsigned char и int на C, если I Не ошибаюсь.
Все выше вещь byte outData
и testPointer
вещи может быть сделана таким образом на C:
unsigned char outData[16];
*(int *)(&outData[0]) = 0x67452301;
И опять же, позиции 1, 2, 3 и 4 из OutData изменяется (индексы начинаются с 1 в этом случае, потому что это C, а не C#).
Таким образом, сделано технически, значение изменения неподписанного символа с 32 разрядным целым указателем а, портирован на C#, и технически это должно дать ту же результаты, как на С.
Теперь я хочу, чтобы изменить значение outData из функции на C# с помощью 32-битного указателя int, но я не буду указывать его как параметр. Итак, только одно решение, сделайте outData глобальной переменной. Затем возникает большая проблема ... если я выложу outData как глобальный, он должен содержаться в классе или структуре, если он не находится в методе (переменные на методах не являются и не могут быть глобальными, если я знаю).
Если я делаю эту глобальную вещь outData через struct/class (только так, как я знаю), outData становится управляемым типом данных, и он перемещается отсюда к нему в ОЗУ из-за GC (GarbageCollector) и использует указатели to outData становится большой проблемой. Итак, вот фиксированный оператор для помощи, который временно помещает outData в фиксированное место в ОЗУ, но также с проблемой, кастинг не разрешен для фиксированных операторов, и тогда я не могу это сделать: int* testPointer = (int*) outData;
, где outData имеет другой блок размер, чем testPointer и литье.
Сказал все предыдущие вещи, возникает реальный вопрос. Как изменить значения outData из функции на C# с помощью 32-битного указателя int? ИЛИ ... Какой алгоритм я могу использовать для внесения этих изменений в outData без использования указателей, и предположим, что outData станет стандартным типом значения, который не нуждается в небезопасных контекстах?
Действительно, было бы очень много, гораздо больше ответов на второй вопрос, потому что реальная цель, которую я хочу выполнить, - это код C-кода на C# и использовать парадигму OO (объектно-ориентированная).
Я схожу с ума, чтобы понять алгоритм для внесения этих изменений значений, хранящихся в ОЗУ, с помощью указателей и использования разных размеров блоков, и просто иметь способ сделать это и быть без указателей, чтобы быть готовым к использованию на языках C# и других языках программирования OO.
Ожидаемое спасибо за любой ответ!
И для справки, вот полный C код программы, что я хочу порт:
Я сделал около 40% портирования, эти функции C собираются указатели, различный блок размеры и что на самом деле это была боль на% * & неделями!
C# - это не тот же язык программирования, что и C. Несмотря на то, что вы можете выполнить поэтапный перевод кода, это не делает его хорошей идеей. Вся идея «портирования» состоит в том, чтобы фактически преобразовать код в идиоматический код для целевого языка. Вам вообще не нужно использовать указатели на C#. –
Правильно! Вы поняли мою точку зрения, я хочу переделать этот кейген, используя парадигму OO, и поместив все идеи и алгоритмы на C#. Опять же, мой реальный ответ - вопрос - как я переношу этот кейген к C#, единственное, «но», с которым я столкнулся, - это то, что переменные значений переменных на C#, как и C, имеют указатели с разными размерами буфера – mishamosher
You просто измените значение объекта. Переполнение стека на самом деле не является местом для кого-то, кто научит вас C#. Вам действительно нужно получить книгу и сначала изучить язык. –