Не могу получить тот же результат, что и код Delphi, после того как я исключил ИЛИ адрес массива символов в C #

Рекомендация от JAVA заключается в присвоении null

из https://docs.oracle.com/cd/E19159-01/819-3681/abebi/index.html

Явное назначение нулевого значения переменным, которые больше не нужны, помогает сборщику мусора идентифицировать части памяти, которые можно безопасно восстановить. Хотя Java обеспечивает управление памятью, это не предотвращает утечку памяти или чрезмерное количество памяти.

Приложение может вызывать утечку памяти, не освобождая ссылки на объекты. Это предотвращает сборщик мусора Java от восстановления этих объектов и приводит к увеличению объема используемой памяти. Явное сокращение ссылок на переменные после их использования позволяет сборщику мусора восстанавливать память.

Один из способов обнаружения утечек памяти - использовать инструменты профилирования и получать снимки памяти после каждой транзакции. Безтекучее приложение в устойчивом состоянии покажет постоянную активную память кучи после сбора мусора.

blockquote>

0
задан Adonis Pso 20 March 2019 в 07:49
поделиться

1 ответ

Похоже, что вы используете этот код 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 #. [тысяча сто двадцать один]

0
ответ дан J... 20 March 2019 в 07:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: