【问题标题】:Use the data in a c# byte array使用 c# 字节数组中的数据
【发布时间】:2012-10-31 16:32:53
【问题描述】:

我有一个图像,包括图像标题,存储在一个 c# 字节数组(字节 [])中。

标头位于字节数组的开头。 如果我将标题放在一个结构中(就像我在 c++ 中所做的那样),它看起来像这样:

typedef struct RS_IMAGE_HEADER
{
   long HeaderVersion;
   long Width;
   long Height;
   long NumberOfBands;
   long ColorDepth;
   long ImageType;
   long OriginalImageWidth;
   long OriginalImageHeight;
   long OffsetX;
   long OffsetY;
   long RESERVED[54];
   long Comment[64];

} RS_IMAGE_HEADER;

如何在 c# 中实现,如何获取和使用图像头中的所有数据(存储在字节数组的开头)?

谢谢

【问题讨论】:

  • 您只想要信息吗?还是您特别想将其加载到结构中? (两者都是可能的)。当然,第一个更容易 - 如果字节顺序正确,BitConverter.ToInt64(data, 0) 可能会这样做......或者你可以“移位”和“或”。
  • 如果你想直接读入结构体,请看这里:stackoverflow.com/questions/2871/…
  • BitMap 类有什么问题?

标签: c# struct bytearray


【解决方案1】:

Structs 在 C# 中完全没问题,因此与您编写的结构几乎完全一样,应该没有问题,尽管您可能需要添加权限修饰符,例如 public。要将字节数组转换为其他原语,有一类非常有用的方法,包括 ToInt64(),它将帮助您将字节数组转换为另一种内置类型(在本例中为 long)。要获取您需要的特定数组字节序列,请查看this question,了解在 C# 中执行数组切片的各种技术。

【讨论】:

    【解决方案2】:

    最简单的方法是在c#中创建一个模拟数据结构,这里我就不多说了,因为它几乎是一样的。下面是从数组中读取单个字节的示例。

    int headerVersionOffset = ... // defined in spec
    byte[] headerVersionBuffer = new byte[sizeof(long)];
    Buffer.BlockCopy(imageBytes, headerVersionOffset, headerVersionBuffer, 0, sizeof(long));
    //Convert bytes to long, etc.
    long headerVersion = BitConverter.ToInt64(headerVersionBuffer, 0);
    

    您可能希望使其适应您的数据结构和使用情况,您也可以使用流或其他自定义数据结构来自动为您处理数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      • 2010-09-05
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多