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<byte>
,从数组的索引 1 开始,到其最后一个元素结束。
您可能需要先将数组转换为Span<byte>
,我不知道它是否隐含。所以应该是((Span<byte>)data).Slice(1);
。这将不会导致复制它本质上是指向数组的安全指针。
Modern (C#8) slicing is using [1..]
.
另外,如果效率很重要,索引到 Span<T>
应该和索引到数组一样快。它是一个直接指针,而不是 ArraySegment<T>
,后者存储对数组的引用和一个偏移量/边界。
【参考方案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#中字节数组的递增指针的主要内容,如果未能解决你的问题,请参考以下文章