像这样的 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 中的参数顺序相反:source、destination
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 中的参数顺序相反:source、destination