gpt4 book ai didi

c# - 使用不安全的 C# 获取指向 ushort 数组的指针并将其写入磁盘(创建文件)

转载 作者:行者123 更新时间:2023-11-30 21:22:51 25 4
gpt4 key购买 nike

我有一个指向 16 位值 x * y 维度数组的 *ushort,我希望能够将其写入磁盘而不复制到托管空间,这可能吗?

最佳答案

试试这个 - 我在 Stream 上创建了一个扩展方法,它将写入一个指向短裤的指针。它具有分配和复制内存的缺点以及大量不安全代码的主要缺点。但是,它确实可以如您所愿地工作。我设置了一个托管数组,然后得到一个指向它的指针来模拟从非托管代码中获取一个 ushort *。

using System;
using System.IO;
using System.Runtime.InteropServices;

namespace UnsafeWriting
{
class Program
{
static void Main(string[] args)
{
ushort[] someArray = new ushort[20];
for (int i = 0; i < 20; i++) { someArray[i] = (ushort)i; }

using (FileStream stm = new FileStream("output.bin", FileMode.Create))
{
unsafe
{
fixed (ushort* dataPtr = &someArray[0])
{
stm.Write(dataPtr, someArray.Length);
}
}
}
}
}

public static class Extensions
{
public static unsafe void Write(this Stream stm, ushort* data, int count)
{
count *= 2;
byte[] arr = new byte[count];
Marshal.Copy(new IntPtr(data), arr, 0, count);
stm.Write(arr, 0, count);
}
}
}

如果你不喜欢分配和复制,那么你可以这样做:

public static unsafe void Write(this Stream stm, ushort* data, int count)
{
count *= 2;
byte* b = (byte*)data;
for (int i = 0; i < count; i++)
{
stm.WriteByte(*b++);
}
}

这也按预期工作,除了在这种情况下您要为每个字节添加方法调用的开销。底层文件系统流缓冲区,因此不会有太多开销,但它仍然存在。

在这两种情况下,不要问我在大端处理器(有没有运行 .NET 的处理器?)上会发生什么。

编辑 - 为了笑,我通过 Reflector 运行 FileStream 以查看底层代码,并且 FileStream 本身缓冲 Write() 和 WriteByte() 调用,所以我认为除了 WriteByte 版本之外没有理由使用任何东西。硬编码到 FileStream 中的缓冲区大小为 4K。

关于c# - 使用不安全的 C# 获取指向 ushort 数组的指针并将其写入磁盘(创建文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2110414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com