Похоже, что вы используете этот код Delphi, не понимая, что он делает.Исходя из ваших результатов, мы можем заключить, что вы используете версию Delphi до Unicode (т.е. D2007 или более раннюю).Также можно предположить, что ZrepBuf
определяет массив байтов или [Ansi] Char.Затем метод работает следующим образом:
For I:= 0 To 3 Do
TmpPChar[I] := ZRepB[Posit+I]; /* Copy four sequential bytes to TmpPChar array */
PLong := @TmpPChar; /* Take a pointer to the head of the array */
InLong := PLong^; /* Dereference the pointer, interpreting as a 32-bit int */
Это код для преобразования четырех байтов в 32-разрядное целое число.В Delphi тип LongInt
является псевдонимом для 32-битного типа integer
, эквивалентного типу int
в C #, а не long
.В коде Delphi оператор XOR не используется.В PLong^
оператор ^
является операцией разыменования.
В C # вы можете полностью избежать кода unsafe
и просто выполнить это преобразование, используя класс BitConverter
:
byte[] b = new byte[4] { 0x2E, 0x02, 0x00, 0x00 };
int result = BitConverter.ToInt32(b, 0); // result == 558
Здесь я определил входной массив как byte[]
, поскольку char
в C # (и в Delphi 2009 или новее) - это 16-битный тип (два байта) для хранения символов Unicode,Данные, которые вы читаете, зашифрованы ANSI - я предполагаю, что вы понимаете, как читать ваш текстовый файл в байтовый массив.
Кстати, в более современном Delphi вы могли бы также переписать код указателя выше, чтобы использовать егокласс TEncoding
для выполнения этой функции , как описано здесь аналогично классу BitConverter
в C #.