gpt4 book ai didi

c# - 从文件中读取非字节数组而不必使用循环?

转载 作者:行者123 更新时间:2023-11-30 15:43:03 24 4
gpt4 key购买 nike

有没有办法像在 C 中那样将二进制数据从文件读取到数组中,我可以将任何类型的指针传递给 i/o 函数?我正在考虑类似 BinaryReader::ReadBytes() 的方法,但它会返回一个字节 [],我无法将其转换为所需的数组指针类型。

最佳答案

如果你有一个固定大小的struct

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
struct MyFixedStruct
{
//..
}

然后您可以使用以下方法一次性阅读它:

public static T ReadStruct<T>(Stream stream)
{
byte[] buffer = new byte[Marshal.SizeOf(typeof(T))];
stream.Read(buffer, 0, Marshal.SizeOf(typeof(T)));
GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
T typedStruct = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
handle.Free();
return typedStruct;
}

这会读入一个字节数组,覆盖struct 的大小,然后将字节数组编码到结构中。你可以像这样使用它:

MyFixedStruct fixedStruct =  ReadStruct<MyFixedStruct>(stream);

只要指定了数组长度,struct 就可以包含数组类型,即:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct MyFixedStruct
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public int[] someInts; // 5 int's
//..
};

编辑:

我看到您只是想读入一个 数组——在这种情况下,只需读入字节数组并使用Buffer.BlockCopy()。转换成你想要的数组:

byte[] someBytes = ..
short[] someShorts = new short[someBytes.Length/2];
Buffer.BlockCopy(someBytes, 0, someShorts, 0, someBytes.Length);

这非常有效,相当于 C++ 中的 memcpy。您唯一的其他开销当然是原始字节数组将被分配并随后被垃圾收集。这种方法也适用于任何其他原始数组类型。

关于c# - 从文件中读取非字节数组而不必使用循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7078057/

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