Код порта C для C #. Проблемы с указателями - PullRequest
0 голосов
/ 31 марта 2012

У меня есть исходный код C для keygen для генерации «мастер-кодов» для заблокированных BIOS Dell.

Старался изо всех сил, трудно понять это, и получил много результатов после многих недель чтения и спрашивания.

Однако есть много вещей, которые я не знаю, как написать их в коде C #, что является моей целью для приключений и академических целей.

Например, я говорю unsigned char outData[16] на C

В 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 (байт - это четверть целого числа на C # (8 бит против 32 бит), то же самое отношение, что и для unsigned char и int на C, если Я не ошибаюсь).

Все вышеперечисленное из вещей byte outData и testPointer может быть сделано таким образом на C:

unsigned char outData[16];
*(int *)(&outData[0]) = 0x67452301;

И затем снова меняются позиции 1, 2, 3 и 4 outData (в данном случае индексы начинаются с 1, потому что это C, а не C #).

Итак, сделано технически, изменить значения беззнакового символа с помощью 32-битного целочисленного указателя, портированного на C #, и это технически должно дать те же результаты, что и на C.

Теперь я хочу изменить значения outData из функции на C # через 32-битный указатель int, но я не буду давать его в качестве параметра. Итак, только одно решение, сделать outData глобальной переменной. Затем возникает большая проблема ... если я опубликую outData как глобальный, он должен содержаться в классе или структуре, если он отсутствует в методе (переменные в методах не являются и не могут быть глобальными, пока я знаю).

Если я делаю эту глобальную вещь outData через struct / class (только так, как я знаю), outData становится управляемым типом данных и перемещается отсюда туда в ОЗУ благодаря GC (GarbageCollector) и использует указатели на outData становится большей проблемой. Итак, здесь приведен фиксированный оператор, помогающий временно поместить OutData в фиксированное место в ОЗУ, но также возникает проблема: приведение типов к фиксированным операторам запрещено, и тогда я не могу этого сделать: int* testPointer = (int*) outData;, где outData имеет необходим другой размер блока, чем testPointer и приведение.

Сказал все предыдущие вещи, приходит реальный вопрос. Как я могу изменить значения outData из функции на C # через 32-битный указатель int? ИЛИ ... Какой алгоритм я могу использовать для внесения этих изменений в outData whitout, используя указатели, и предположим, что outData станет стандартным типом значений, который не нуждается в небезопасных контекстах?

На самом деле очень хотелось бы получить гораздо больше ответов на второй вопрос, потому что реальная цель, которую я хочу достичь, это перенести код C на C # и использовать OO (объектно-ориентированную) парадигму.

Я схожу с ума, пытаясь понять алгоритм для внесения этих изменений значений, хранящихся в ОЗУ, с помощью указателей и с использованием блоков разных размеров, и просто имею метод, позволяющий это сделать, и быть свободным от указателей, чтобы быть готовым к использованию на C # и другие языки программирования OO.

Ожидаемое спасибо за любой ответ!

И, для справки, вот полный C-код программы, которую я хочу перенести:

http://pastebin.com/w8VQjVBu

Я сделал около 40% портирования, эти функции C идут на указатели, блоки разных размеров, и эти вещи действительно мучают% * & в течение нескольких недель!

Ответы [ 2 ]

1 голос
/ 31 марта 2012

Звучит так, будто вы пытаетесь скопировать значение 32-битного целого в первые четыре байта массива байтов.

Для этого используйте метод BitConverter.GetBytes и скопируйте полученные байты в другой массив:

var n = 0xFAFBFCFD;
var a = new byte[16];
var temp = BitConverter.GetBytes(n);
temp.CopyTo(a, 0);

Сейчас:

a[0] == 0xFD
a[1] == 0xFC
a[2] == 0xFB
a[3] == 0xFA

Как говорят некоторые комментарии, плохая идея пытаться писать на C # так, как если бы это был C.

0 голосов
/ 31 марта 2012

Поскольку вы говорите о чтении и записи 16-байтовых фрагментов, составленных из целых чисел, я думаю, что вы ищете классы BinaryReader и BinaryWriter.Google даст вам множество демонстраций о том, как использовать эти классы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...