如何转换列表C# 中的 Byte[]
从 Double[] src 到 Byte[] dst 的转换 可以在 C# 中通过固定指针有效地完成:
fixed( Double* pSrc = src)
{
fixed( Byte* pDst = dst)
{
Byte* ps = (Byte*)pSrc;
for (int i=0; i < dstLength; i++)
{
*(pDst + i) = *(ps +i);
}
}
}
如何对 List src 执行相同操作? 即如何获得指向数组 Double[] 的固定指针 包含在列表中? 谢谢。
Convertion from Double[] src to Byte[] dst
can be efficiently done in C# by fixed pointers:
fixed( Double* pSrc = src)
{
fixed( Byte* pDst = dst)
{
Byte* ps = (Byte*)pSrc;
for (int i=0; i < dstLength; i++)
{
*(pDst + i) = *(ps +i);
}
}
}
How can I do the same for List src ?
I.e. how can I get fixed pointer to array Double[]
included in List ?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
我之前使用过这些辅助方法:
一个例子:
I have used these helper methods before:
An example:
不确定你的意图是什么,但我认为......你想要
System.Runtime.Interopservices.Marshal.StructToPtr
。not sure what you are intending, but I think ... you want
System.Runtime.Interopservices.Marshal.StructToPtr
.您始终可以在
List
对象上使用ToArray()
方法来获取Double[]
。You can always use the
ToArray()
method on theList<Double>
object to get aDouble[]
.您可以使用反射来获取对 List 实例中的私有 T[] _items 字段的引用。
警告:在代码片段中,您需要确保 dstLength 是 dst 和 src 长度(以字节为单位)中的最小值,这样您就不会尝试复制比可用字节更多的字节。可能您是通过创建 dst 来实现的,其大小与 src 完全匹配,但您的代码片段并没有说明这一点。
You can use reflection to get the reference to the private T[] _items field, in the List instance.
Warning: In your code snippet, you need to make sure dstLength is the minimum of dst and src lengths in bytes, so that you don't try to copy more bytes than what are available. Probably you do so by creating dst with exactly the needed size to match the src, but your snippet doesn't make it clear.
使用
List.ToArray()
方法并对结果数组进行操作。Use the
List<T>.ToArray()
method and operate on the resulting array.这可能有效,但您将丢失数据 - 数组的内容将为 3 和 34 。
This might work, but you will have a data loss- content of the array will be 3 and 34 .
为什么不像往常一样访问该列表呢?
我还没有彻底测试它,我很少需要不安全的代码,但它似乎工作得很好。
编辑:这是另一个(我个人更推荐)解决方案,没有不安全的代码:
Why don't you just access the list as usual?
I haven't tested it thoroughly and i seldomly need unsafe code, but it seems to work fine.
Edit: here is another (imo preferable) solution, without unsafe code: