我需要将两个字节组合成一个int值。
我从相机接收一个16位图像,两个连续字节的强度值为一个像素。我的目标是将这两个字节组合成一个" int"谷。
我设法使用以下代码执行此操作:
for (int i = 0; i < VectorLength * 2; i = i + 2)
{
NewImageVector[ImagePointer] = ((int)(buffer.Array[i + 1]) << 8) | ((int)(buffer.Array[i]));
ImagePointer++;
}
我的图像是1280 * 960,因此VectorLength == 1228800,并且缓冲区大小为2 * 1228800 = 2457600个元素......
有什么办法可以加快速度吗? 也许有另一种方式,所以我不需要使用for循环。
谢谢
答案 0 :(得分:3)
您可以使用等效于c的并集。我不确定是否更快,但更优雅:
[StructLayout(LayoutKind.Explicit)]
struct byte_array
{
[FieldOffset(0)]
public byte byte1;
[FieldOffset(1)]
public byte byte2;
[FieldOffset(0)]
public short int0;
}
像这样使用它:
byte_array ba = new byte_array();
//insert the two bytes
ba.byte1 = (byte)(buffer.Array[i]);
ba.byte2 = (byte)(buffer.Array[i + 1]);
//get the integer
NewImageVector[ImagePointer] = ba.int1;
您可以填充两个字节并使用int。要找到更快的方法,请使用StopWatch-Class并比较两种方式:
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
//The code
stopWatch.Stop();
MessageBox.Show(stopWatch.ElapsedTicks.ToString()); //Or milliseconds ,...
答案 1 :(得分:2)
假设您可以(重新)将NewImageVector
定义为short[]
,并且Buffer
中的每两个连续字节应转换为short
(基本上就是您和#39;现在正在做,只有你之后才转为int
,你可以使用Buffer.BlockCopy为你做这件事。
正如文档所述,您Buffer.BlockCopy
将字节从一个数组复制到另一个数组,因此为了在缓冲区中复制您的字节,您需要执行以下操作:
Buffer.BlockCopy(Buffer, 0, NewImageVector, 0, [NumberOfExpectedShorts] * 2)
这告诉BlockCopy
您希望从索引0开始将Buffer
中的字节从索引0开始复制到NewImageVector
,并且要复制[NumberOfExpectedShorts] * 2
bytes(因为每个short都是两个字节长)。
没有循环,但它确实取决于使用short[]
数组而不是int[]
数组的能力(实际上,使用数组开始时)。
请注意,这还要求Buffer
中的字节为little-endian
顺序(即Buffer[index]
包含低字节,buffer[index + 1]
为高字节。
答案 2 :(得分:1)
通过使用不安全的指针来迭代数组,可以实现小的性能提升。以下代码假定source
是输入字节数组(在您的情况下为buffer.Array
)。它还假设source
具有偶数个元素。在生产代码中,您显然必须检查这些内容。
int[] output = new int[source.Length / 2];
fixed (byte* pSource = source)
fixed (int* pDestination = output)
{
byte* sourceIterator = pSource;
int* destIterator = pDestination;
for (int i = 0; i < output.Length; i++)
{
(*destIterator) = ((*sourceIterator) | (*(sourceIterator + 1) << 8));
destIterator++;
sourceIterator += 2;
}
}
return output;