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

What is C# analog for C's two-dimensional array access like that: 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

调色板是一个 4x4 的方阵。

使用 val & 3 你只考虑 val 变量值的前 2 位:这意味着你正在访问最大索引 0x03.

任何具有 val 的值都只考虑前 2 位。

例如,如果 val 是 8 位明智的:

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

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

在 C 中,palette 只是一个指针,可以随时取消引用。 pallete[i] 在 C 中甚至对于 u8 palette[4][4]; 也是有效的。但是,当您在 C# 中声明 byte[,] palette = new byte[4,4]; 时,您 必须 正确使用两个索引来访问数组。您可能希望在 C# 中将 palette 声明为展平数组 byte[] palette = new byte[4*4] 并为 pallete[x,y] 编写 palette[y*4 + x].

在 C 中,您可以指向数组中的特定行,因为 C 数组只是项目的序列。两个后续数组再次只是项目序列,这就是为什么可以在 C 中访问 sub-array 的原因。这就是为什么不能仅从数组指针获取 C 中数组的大小。

在 C# 中,有两种类型的 "multidimensional" 数组:Multidimensional arrays and Jagged Arrays.

Classic multi-dimensional 无法仅通过 sub-index 访问,因为 C# 中的数组不仅仅是一个项目序列,还有一个 header in which contain size of array, type pointer and sync block。随后的两个 C# 数组将包含一个 header 并且它不符合 C# 数组格式。

Jagged array 是数组的数组,您可以仅使用 sub-index 以类似于 C# 的方式访问 sub-array。

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 are parameters in order: destination, source whereas in Array.Copy 中的参数顺序相反:sourcedestination