C#模拟C的二维数组访问是什么:palette[val&3]?



在C代码中定义了这样的数组:u8 palette[4][4];

后来访问了一些类似的元素:palette[ val & 3 ]

在C代码中,它是这样使用的:memcpy(dest3+12, palette[ val & 3 ], 4);

我不明白通过这段代码可以访问什么元素。我试着在C#中做同样的事情,但它告诉我Wrong number of indices inside []; exptected 2

在C中,您可以指向数组中的特定行,因为C数组只是项的序列。后面的两个数组又只是一个项目序列,这就是为什么可以访问C中的子数组。这就是为什么,不能仅从数组指针获得C中数组的大小。

在C#中,有两种类型的"多维"数组:多维数组和锯齿数组。

经典多维不能仅通过子索引访问,因为C#中的数组不仅仅是一个项目序列,还有一个标头,其中包含数组大小、类型指针和同步块。随后的两个C#数组将在内部包含一个标头,并且它将不满足C#数组格式。

Jagged数组是数组的数组,您可以像C#一样只使用子索引访问子数组。

C#中的等效代码为:

byte[][] palette = new byte[4][];
for (int i = 0; i < palette.Length; i++)
{
   palette[i] = new byte[4];
}
byte[] destination = new byte[4];
int val = 1;
Array.Copy(palette[val & 3], 0, destination, 12, 4);

请注意,在memcpy中,参数的顺序是:destinationsource;而在Array中。Copy是按相反顺序的参数:sourcedestination

在C中,palette只是一个指针,可以在任何时候取消引用。即使对于CCD_ 7,CCD_。但是,当您在C#中声明byte[,] palette = new byte[4,4];时,必须正确地使用两个索引来访问数组。您可能希望在C#中将palette声明为展开的数组byte[] palette = new byte[4*4],而对于pallete[x,y],则编写palette[y*4 + x]

调色板是一个正方形的matix 4x4。

使用val & 3时,您只考虑val变量值的前2位:这意味着您访问的是最大索引0x03

无论值为val,都只考虑前2位。

例如,如果val为8位:

    val
0b11111100 & 3 = 0b00000000
0b11111101 & 3 = 0b00000001
0b11111110 & 3 = 0b00000010
0b11111111 & 3 = 0b00000011

您的代码正在逐行访问数组。

最新更新