几天来,我一直在尝试将以下c ++代码转换为c#。通过引用对数组进行索引,其中引用由计算结果确定。
pData[data_id] ^= ((const uint8_t *)ValueTable)[tbl_id & 0x3FF];
对右边表达的评估是我正在努力的领域。
当我尝试在c#中执行此操作时,我得到的结果是数组值而不是索引。
当我尝试将其用作索引时,索引计算(0x309)的结果超出了固定数组大小(256x UInt32值)的范围,因此,每当我感到接近此值时,我都会得到C#中的边界异常。...在c ++中这似乎不是问题吗?
很抱歉,如果这对大家都很明显,我对c ++和c#的经验是有限的。如果有人能指出我的方向,将不胜感激。
预先感谢
答案 0 :(得分:1)
您需要显示C#及其实际值。 tbl_id & 0x3FF == 0x309
当然是可能的,因为0x309
中的所有位也都在0x3FF
中设置了。
& 0x3FF
,那么我希望ValueTable
具有0x3FF + 1
个元素(1024)。ValueTable
实际上仅应具有256个元素并且应该环绕,那么请使用& 0xFF
(请注意,如果可能未设置低位,则使用%
进行包裹通常更安全,例如,假设您有100个元素)。ValueTable
是1024字节(uint8_t
),则在C#中使用byte[1024]
而不是256个32位整数。ValueTable
是256个32位整数,但是您要在此处访问一个字节,那么将其更改为byte[]
是最简单的方法,否则采用整数索引(index / 4
),然后从该整数中获取相关的字节(可能是i = tbl_id & 0x3FF; BitConverter.GetBytes(table[i / 4])[i % 4]
;)