2012-03-31 2 views
0

У меня есть исходный код 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 код программы, что я хочу порт:

http://pastebin.com/w8VQjVBu

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

+1

C# - это не тот же язык программирования, что и C. Несмотря на то, что вы можете выполнить поэтапный перевод кода, это не делает его хорошей идеей. Вся идея «портирования» состоит в том, чтобы фактически преобразовать код в идиоматический код для целевого языка. Вам вообще не нужно использовать указатели на C#. –

+0

Правильно! Вы поняли мою точку зрения, я хочу переделать этот кейген, используя парадигму OO, и поместив все идеи и алгоритмы на C#. Опять же, мой реальный ответ - вопрос - как я переношу этот кейген к C#, единственное, «но», с которым я столкнулся, - это то, что переменные значений переменных на C#, как и C, имеют указатели с разными размерами буфера – mishamosher

+0

You просто измените значение объекта. Переполнение стека на самом деле не является местом для кого-то, кто научит вас C#. Вам действительно нужно получить книгу и сначала изучить язык. –

ответ

1

Похоже, вы пытаетесь скопировать значение 32 бит int в первые четыре байта массива байтов.

Для этого используется метод 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

Просто отличный, отличный метод! Теперь, если я хочу, скажем, не конвертировать 32-битные знаковые целые числа в массивы байтов, но да для преобразования десятичных чисел mmm ... 128 бит в массивы беззнаковых 16-битных целых чисел. Я уже понял, что есть BitConverter для int, double, float, single и т. Д. И т. Д. Есть ли что-то вроде UInt16Converter для int, double, float, single и т. Д. И т. Д.? – mishamosher

+0

Поиск MSDN для всех Результаты преобразования, я понимаю, что существуют конвертеры для каждого типа числовых переменных и комбинаций, но они больше походят на метод «Convert.To ». Не нашел таких вещей, как «GetBytes» для каждого типа, который больше мне нужен (GetUInt32s, GetSBytes и т. Д.). – mishamosher

+0

Вам, вероятно, потребуется несколько шагов преобразования GetBytes -> Byte Array -> ToUint16.Класс BitConverter предоставляет множество методов для преобразования примитивов в и из массивов байтов. –

0

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

+0

Спасибо, Брэннон, он делает то же самое, что GetBytes -> Byte Array -> To , но у него есть более интересные вещи для обработки этих преобразований, и именно по этой причине я буду продолжать с этим, а не с BitConverter :). Важно отметить, что они больше полагаются на StreamWriters, но это делает вещи более крупными. – mishamosher

Смежные вопросы