【问题标题】:C# - How do I create a new byte array from a portion of a larger oneC# - 如何从一个较大的字节数组的一部分创建一个新的字节数组
【发布时间】:2013-08-18 07:14:29
【问题描述】:

我对编码比较陌生,所以我不确定这是否是一个非常明显的问题。 我所拥有的是一个有序的字节列表,这些字节表示像素和与这些像素相关的深度数据,因此当返回到一个框中时,它们会创建一个图像。我想要做的是将这些字节的一个较小的矩形隔离到一个新的字节数组中。

所以基本上我想跳过数组开头的大量字节(完全在较小矩形部分上方的字节),以及它左侧的第一批,然后添加一行将较小的盒子的长度添加到新数组中,然后跳过盒子右侧的那些,跳过下一行的左侧,添加长度,跳过右侧并重复所有操作,直到我到达盒子的末尾.

我真的希望糟糕的解释对某人有意义。我不知道该怎么做。任何帮助将不胜感激!

谢谢!

【问题讨论】:

  • 数组是多维的吗?还是像内存中的原始数据一样连续?
  • 刚刚查找了多维数组是什么,它是连续的。
  • 每个像素只有一个字节还是几个?
  • 请您添加一些示例代码。

标签: c# byte bytearray


【解决方案1】:

最简单的选择可能是创建一个大小合适的字节数组,然后使用Array.CopyBuffer.BlockCopy - 多次使用,听它的声音。

我怀疑您需要每行调用一次复制方法,计算出源数据中行的相关部分从哪里开始,在目标数据中行的相关部分从哪里开始。现在你已经有了基本的想法,剩下的暂时留给你 - 但请随时要求更多澄清。不要忘记(在您的计算中)“目标”行号将不等于“源”行号! (我怀疑循环目标行号并添加偏移量是最简单的......)

【讨论】:

  • 你的意思是System.Array.Copy()?我认为System.arraycopy 是Java。如果性能是一个问题,根据我的经验,Buffer.BlockCopy() 更快,但需要格外小心才能正确设置字节偏移量。
  • @Rotem 当它是一个字节[] 时,不需要“额外的照顾”;但可以肯定的是,对于 double[],您需要牢记元素大小
  • @Rotem 我没有想到Buffer.BlockCopy 方法。有一个线程Array.Copy vs Buffer.BlockCopy
  • @Rotem:是的——我出于某种原因处于 Java 模式!也添加了Buffer.BlockCopy 的引用。
【解决方案2】:

我认为它看起来像这样:

const int numberOfBytesPerPixel = ...;

// input: original data
int originalWidth = ...;
int originalHeight = ...;
byte[] original = ...; // should have the correct size and contain the data

// input: desired position and size for cropping rectangle
int cropOffsetToTheRight = ...;
int cropOffsetDown = ...;
int cropWidth = ...;
int cropHeight = ...;

// get the rectangle:
byte[] crop = new byte[numberOfBytesPerPixel * cropWidth * cropHeight];
for (int rowNumber = 0; rowNumber < cropHeight; ++rowNumber)
{
    Array.Copy(
        original,
        numberOfBytesPerPixel * ((cropOffsetDown + rowNumber) * originalWidth + cropOffsetToTheRight),
        crop,
        numberOfBytesPerPixel * rowNumber,
        numberOfBytesPerPixel * cropWidth
        );
}

这是the overload of Array.Copy used 的文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    相关资源
    最近更新 更多