我一直在尝试将以下c ++代码转换为c#多天。通过引用索引数组,引用由计算结果确定。
pData[data_id] ^= ((const uint8_t *)ValueTable)[tbl_id & 0x3FF];
对右侧表达的评价是我正在努力的领域。
当我尝试在c#中执行此操作时,我将结果作为数组值而不是它的索引。
当我尝试将它用作索引时,索引计算的结果(0x309)超出了固定数组大小的范围(256x UInt32值),所以每当我觉得我接近这个时,我就会得到一个c#中的边界异常....这在c ++中似乎不是问题?
抱歉,如果这对你们都很明显,我对c ++和c#的体验是有限的。如果有人能指出我在这里的方向,将不胜感激。
提前致谢
您需要显示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]
;)