#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
и ссылаясь на результат вычисления в качестве индекса массива.