C#如何从字节数组中提取字节?已知起始字节

Posted

技术标签:

【中文标题】C#如何从字节数组中提取字节?已知起始字节【英文标题】:C# How to extract bytes from byte array? With known starting byte 【发布时间】:2015-04-14 12:07:56 【问题描述】:

我需要从字节数组中获取特定字节。我知道我想要的第一个字节的内容,之后我需要 x 个字节。

例如,我有

byte [] readbuffer  0, 1, 2, 0x55, 3, 4, 5, 6;
byte [] results = new byte[30];

我需要出现在“0x55”之后的3个字节

byte results == ox55aa, 3, 4, 5

我正在使用:

Array.copy(readbuffer, "need the index of 0x55" ,results, 0, 3);

我需要找到0x55的索引

PS:0x55 在数组中处于随机位置。 PS2:我之前忘了提到我在.Net Micro Framework 中工作。

(对于非代码描述,我很抱歉,我是编程的新手......和英语)

提前谢谢你

[编辑]x2

【问题讨论】:

你的问题真的不清楚......如果你在代码中给出一个例子,而不是试图描述它,它会很多更容易帮助你。 (0x55aa 不是有效的字节值,所以不能出现在数组中...) 您在寻找 BinaryReader 类吗?您可以设置要读取的起始字节数 @Jon Skeet 你说得对,它只是 0x55(我对此感到困惑,因为我真的想在我的项目中找到 0x55 和 0xaa)。 【参考方案1】:

可以这样实现:

byte[] bytes = new byte[]  1, 2, 3, 4, 0x55, 6, 7, 8 ;
byte[] newBytes = new byte[4];
Buffer.BlockCopy(bytes,Array.IndexOf(bytes,(byte)0x55), newBytes,0,4);

【讨论】:

我不知道BlockCopy,所以我搜索了它,发现它类似于Array.Copy,但适用于字节级别。由于他使用的是字节数组,所以这里没问题,但在其他数组上会失败:***.com/questions/1389821/…。因此我推荐 Array.Copy。但总的来说,你的解决方案比我的更优雅。 @TobiasKnauss,我将 BlockCopy 用于其他数组类型,并进行了一些代码更改,它比 Array.Copy 效率更高(因为我很久以前工作过,所以无法提供链接)。无论如何,最初的问题使用字节,所以块复制很酷。 @TobiasKnauss 忘记在 IndexOf 中进行强制转换,修复了我的错误 可能效率不高:codeproject.com/Articles/65183/…。我没有使用它,所以我只能参考其他文档。我在第一次搜索 BlockCopy 时发现了那个。 感谢您的回答。我忘了提到我正在使用 .Net Micro Framework,抱歉。我编辑了我的问题。【参考方案2】:

我猜你只需要在整个数组中搜索特定值并记住找到它的索引...

int iIndex = 0;  
for (; iIndex < valuearray.Length; iIndex++);
  if (valuearray[iIndex] == searchedValue) break;

从这里开始,用找到的索引做你想做的事。

附:也许有轻微的语法错误,因为我通常使用 C++.net

【讨论】:

谢谢。我试过了,它不工作。我忘了提到我正在使用 .Net Micro Framework。 PS.:我编辑了我的问题。【参考方案3】:
        byte[] results = new byte[16];
        int index = Array.IndexOf(readBuffer, (byte)0x55);
        Array.Copy(readBuffer, index, results, 0, 16);

谢谢大家。

这是我现在的代码。它按我的预期工作:)

【讨论】:

以上是关于C#如何从字节数组中提取字节?已知起始字节的主要内容,如果未能解决你的问题,请参考以下文章

从字节数组运行程序

如何从 Python 3 中的字节数组中的特定位中提取值?

如何在 C++ 中从字节数组(在 BIG-ENDIAN 中)中提取单个字段

如何从 ByteBuffer 中提取使用过的字节数组?

如何从字节数组元素中解包/提取低阶和高阶值

如何将字节数组从 c# 传递到 MFC ActiveX