C#中字节数组的递增指针

Posted

技术标签:

【中文标题】C#中字节数组的递增指针【英文标题】:Increment pointer of byte array in C# 【发布时间】:2021-06-21 23:57:57 【问题描述】:

我有一个byte[] data,其中不需要第一个元素。数组很安静,所以我不想将它复制到另一个数组(payload),如下所示。

Buffer.BlockCopy(data, 1, payload, 0, count);

在 C++ 中,我可以只增加数组的指针来移动指针。

int main()

    char* data= "!Hello, World!";
    data++;
    std::cout << data<< std::endl;

这部分代码打印“Hello, World!”。我如何在 C# 中做同样的事情?也许使用不安全的代码?

【问题讨论】:

通过对数组进行切片来使用跨度,data.Slice(1) 将创建一个Span&lt;byte&gt;,从数组的索引 1 开始,到其最后一个元素结束。 您可能需要先将数组转换为Span&lt;byte&gt;,我不知道它是否隐含。所以应该是((Span&lt;byte&gt;)data).Slice(1);。这将不会导致复制它本质上是指向数组的安全指针。 Modern (C#8) slicing is using [1..]. 另外,如果效率很重要,索引到 Span&lt;T&gt; 应该和索引到数组一样快。它是一个直接指针,而不是 ArraySegment&lt;T&gt;,后者存储对数组的引用一个偏移量/边界。 【参考方案1】:

You can slice arrays in c#8 using [1..].

var data = new char[] '!','H','e','l','l','o',' ','W','o','r','l','d','!';
foreach(var ch in data[1..]) Console.Write(ch);
Console.WriteLine();

给出: 世界你好!

【讨论】:

【参考方案2】:

数组的长度是不可变的,所以要么从索引 1 而不是 0 开始循环等等,要么将其复制到另一个

【讨论】:

以上是关于C#中字节数组的递增指针的主要内容,如果未能解决你的问题,请参考以下文章

c#拷贝数组指针中的元素到变量中

将字节数组从 c++ 传递到 c# 程序集都有哪些不同的方法?

java和c#的字节数组转换问题

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

C# 比较两个包含小写文本的 byte[] 数组

C# - 我可以使用数组初始化器从另一个字节数组中构建一个字节数组吗?