преобразование указателя индекса постоянного массива из C в C#

#c# #c

#c# #c

Вопрос:

Я пытался преобразовать следующий код c в c # в течение нескольких дней. Индексирование массива по ссылке, при этом ссылка определяется результатом вычисления.

 pData[data_id] ^= ((const uint8_t *)ValueTable)[tbl_id amp; 0x3FF];
  

Оценка выражения в правой части — это область, с которой я борюсь.

Когда я пытаюсь сделать это на c #, я получаю результат в виде значения массива, а не его индекса.

Когда я пытаюсь использовать его в качестве индекса, результат вычисления индекса (0x309) выходит за пределы фиксированного размера массива (256x UInt32 значения), поэтому каждый раз, когда я чувствую, что приближаюсь к этому, я получаю исключение out of bounds в c #…. Похоже, это не проблема в c ?

Прошу прощения, если это очевидно для всех вас, мой опыт работы с c и c # ограничен. Если кто-нибудь может указать мне направление здесь, это было бы оценено.

Заранее спасибо

Комментарии:

1. Без кода на C # трудно быть уверенным, но я думаю, что ваша проблема в том, что вы индексируете 4-байтовые значения ( UInt32 ) вместо однобайтовых значений ( uint8_t ).

2. Пожалуйста, добавьте немного кода на c #, чтобы мы могли помочь

3. Создайте массив размером 0x400 байт. байт[] pData = новый байт[0x400]. Если вы вызываете c , вы должны поместить массив в неуправляемую память. Итак, используя Маршал. Alloc() вернет указатель необходимого размера. Если вы возвращаете значение из c , то вы должны скопировать неуправляемый объект в управляемую память с помощью Marshal. PtrТоСтруктура.

Ответ №1:

Вам нужно показать C # и каковы на самом деле значения. tbl_id amp; 0x3FF == 0x309 безусловно, возможно, поскольку все биты в 0x309 также заданы 0x3FF .

  • Если вы используете amp; 0x3FF , то я бы ожидал ValueTable , что у вас будут 0x3FF 1 элементы (1024).
  • Если ValueTable только действительно должно быть 256 элементов, и оно должно быть обернуто, тогда используйте amp; 0xFF (обратите внимание, что использование % обычно безопаснее для переноса, если младшие биты могут не быть установлены, скажем, если у вас 100 элементов).
  • Если ValueTable подразумевается 1024 байта ( uint8_t ), то используйте byte[1024] в C # вместо 256 32-битных целых чисел.
  • Если ValueTable это 256 32-битных целых чисел, но вы хотите получить доступ к байту здесь, то изменить его на byte[] является наиболее простым, иначе возьмите целочисленный индекс ( index / 4 ), затем получите соответствующий байт из этого целого числа (возможно i = tbl_id amp; 0x3FF; BitConverter.GetBytes(table[i / 4])[i % 4] 😉

Комментарии:

1. Большое спасибо Fire Lancer. Я преобразовал 256 элементов в массив из 1024-кратных байтовых значений, используя BitConverter.GetBytes и ссылаясь на результат вычисления в качестве индекса массива.