【问题标题】:Scanning byte array as uint array将字节数组扫描为 uint 数组
【发布时间】:2011-04-25 04:28:22
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: c# performance


    【解决方案1】:

    如果代码必须是安全的,并且您不想使用更大的类型和“移位”,那么您将不得不对每个字节进行迭代。

    (edit) 如果数据足够稀疏,您可以使用字典来存储非零值;然后找到非零值是微不足道的(稀疏数组变得巨大变得便宜)。

    【讨论】:

    • 你可能是对的,我也不知道有什么办法。可惜,这是一个非常容易获得的性能。在大多数字节非零(但通常它们大多为零)的情况下,移位等实际上会使其变慢。
    • @user72185 - 要检查的一件事; WP7 是否支持结构的显式布局?我不认为确实如此,但值得一试吗?
    【解决方案2】:

    我会按照这个人所说的: Using SSE in c# is it possible?

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

    【讨论】:

    • 在某些方面是“不安全的隐身:将不安全的代码放在我们看不到的地方”......当然,这是否明智取决于 OP。
    • 我想要,但它必须在 Windows Phone 7 上运行,所以它不是一个选项 :(
    • @Marc:它不仅仅是隐身,它还允许应用 SSE 指令,否则不会使用(因为据我所知,它们不能在 .NET 本身中显式编码)。
    【解决方案3】:

    你可以访问字符

    string.ToCharArray()
    

    或者你可以访问原始字节[]

    Text.Encoding.UTF8Encoding.GetBytes(stringvalue)
    

    最终,我认为你需要的是

    MemoryStream stream;
    stream.Write(...)
    

    那么你就可以直接处理内存的缓冲区了

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

    【讨论】:

    • 嗯,我想我可以说:“我做到了”哈哈
    【解决方案4】:

    您可以使用BitConverter 类:

    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
    }
    

    另一种选择是从字节数组创建MemoryStream,然后使用BinaryReader 从中读取32 位值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-02
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 2019-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多