C# 重塑数组 1->2 D 而不复制数据
C# reshape array 1->2 D without duplicating data
我使用的是相机制造商的 C# SDK。他们有一个方法:
CaptureImage(struct ExpSettings, ref ushort[] pixelbuffer)
我希望将一维数组像素缓冲区重塑为二维数组。
现在我正在使用 Buffer.BlockCopy
正如 Jon Skeet 在 SO 上的一个类似问题中所建议的那样。
但是我在想是否有一种方法(在 C# 中)无需复制实际数据即可执行此操作。在 C 中,我猜你可以使用联合。
你能以某种方式创建一个数组 UInt16[,] My2DImageData = new UInt[1000, 1000]
然后 "point the data array" 到上面的像素缓冲区吗?
感谢您的宝贵时间。
亲切的问候/亨里克
如果您只对通过索引器访问成员感兴趣并且不想复制数据,则可以使用包装器 class。
class ArrayWrapper<T>
{
private readonly T[] _arr;
private readonly int _w, _h;
public ArrayWrapper(T[] arr, int w, int h)
{
if(arr == null)
throw new ArgumentNullException("arr");
if(arr.Length != w*h)
throw new ArgumentException("Invalid array length", "arr");
_arr = arr;
_w = w;
_h = h;
}
public T this[int i, int j]
{
get { return _arr[i*_w + j]; }
}
}
var arr = new[] {
0, 1, 2, 3,
4, 5, 6, 7,
8, 9, 10, 11,
12, 13, 14, 15 };
var wrapper = new ArrayWrapper<int>(arr, 4, 4);
Console.WriteLine(wrapper[1, 1]); // prints 5
我使用的是相机制造商的 C# SDK。他们有一个方法:
CaptureImage(struct ExpSettings, ref ushort[] pixelbuffer)
我希望将一维数组像素缓冲区重塑为二维数组。
现在我正在使用 Buffer.BlockCopy
正如 Jon Skeet 在 SO 上的一个类似问题中所建议的那样。
但是我在想是否有一种方法(在 C# 中)无需复制实际数据即可执行此操作。在 C 中,我猜你可以使用联合。
你能以某种方式创建一个数组 UInt16[,] My2DImageData = new UInt[1000, 1000]
然后 "point the data array" 到上面的像素缓冲区吗?
感谢您的宝贵时间。 亲切的问候/亨里克
如果您只对通过索引器访问成员感兴趣并且不想复制数据,则可以使用包装器 class。
class ArrayWrapper<T>
{
private readonly T[] _arr;
private readonly int _w, _h;
public ArrayWrapper(T[] arr, int w, int h)
{
if(arr == null)
throw new ArgumentNullException("arr");
if(arr.Length != w*h)
throw new ArgumentException("Invalid array length", "arr");
_arr = arr;
_w = w;
_h = h;
}
public T this[int i, int j]
{
get { return _arr[i*_w + j]; }
}
}
var arr = new[] {
0, 1, 2, 3,
4, 5, 6, 7,
8, 9, 10, 11,
12, 13, 14, 15 };
var wrapper = new ArrayWrapper<int>(arr, 4, 4);
Console.WriteLine(wrapper[1, 1]); // prints 5