C# 将字节数组扫描为uint数组

C# 将字节数组扫描为uint数组,c#,performance,C#,Performance,我有一个大部分为0的大字节数组,但有些值需要处理。如果是C++或不安全C,我将使用32位指针,只有当前32位不是0时,我才会查看各个字节。这样可以更快地扫描所有0块。不幸的是,这必须是安全的(C:-) 我可以使用uint数组而不是字节数组,然后操纵单个字节,但这会使我正在做的事情比我喜欢的要混乱得多。我正在寻找更简单的东西,比如指针示例(我错过了指针) 谢谢 您可以访问这些字符 string.ToCharArray() 或者您可以访问原始字节[] Text.Encoding.UTF8Encod

我有一个大部分为0的大字节数组,但有些值需要处理。如果是C++或不安全C,我将使用32位指针,只有当前32位不是0时,我才会查看各个字节。这样可以更快地扫描所有0块。不幸的是,这必须是安全的(C:-)

我可以使用uint数组而不是字节数组,然后操纵单个字节,但这会使我正在做的事情比我喜欢的要混乱得多。我正在寻找更简单的东西,比如指针示例(我错过了指针)


谢谢

您可以访问这些字符

string.ToCharArray()
或者您可以访问原始字节[]

Text.Encoding.UTF8Encoding.GetBytes(stringvalue)
最终,我认为你需要的是

MemoryStream stream;
stream.Write(...)
然后,您将能够直接删除内存的缓冲区


还有
UnmanagedMemoryStream
,但我不确定它是否会在内部使用不安全的调用

我会按照这家伙说的:


基本上,编写一点C/C++,可能使用SSE,以有效地实现扫描部分,并从C#调用它。

如果代码必须是安全的,并且您不想使用更大的类型和“shift”,那么您必须迭代每个字节


(编辑)如果数据足够稀疏,可以使用字典存储非零值;然后,查找非零是很简单的(并且稀疏数组所带来的巨大开销会变得很便宜)。

您可以使用
位转换器
类:

byte[] byteArray = GetByteArray(); // or whatever
for (int i = 0; i < b.Length; I += 2)
{
    uint x = BitConverter.ToUInt32(byteArray, i);
    // do what you want with x
}
字节[]byteArray=GetByteArray();//或者别的什么 对于(int i=0;i
另一种选择是从字节数组创建一个
MemoryStream
,然后使用一个
BinaryReader
从中读取32位值。

Mmmm我想我可以说:“我做了”LOLIn的某些方式是“通过隐藏不安全:将不安全的代码放在我们看不到的地方”。。。当然,这取决于OP是否合理。我想这样做,但它必须在Windows Phone 7上运行,因此它不是一个选项:(@Marc:它不仅仅是隐形的,它允许在没有其他指令的情况下应用SSE指令(据我所知,它们无法在.NET本身中显式编码)。你可能是对的,我也不知道有什么方法可以做到。遗憾的是,这是一个非常容易的性能增益。在大多数字节都不为零的情况下(但通常都为零),移位等实际上会使速度变慢。@user72185-需要检查的一件事;WP7支持结构上的显式布局吗?我不认为它支持,但值得一试?