我正在使用BinaryReader.Read
从二进制文件读取字节,并使用fixed
语句将字节“转换”为结构:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
unsafe struct MyStruct
{
// some variables.. too many to list
public fixed Byte Software[32];
public UInt16 FC_Day;
public UInt16 FC_Year;
public UInt16 Header_Size;
public UInt32 Offset_to_Data;
// more variables.. too many to list
};
然后在Main(Main)中查看
byte[] ReadBytes = new byte[227];
MyStruct* Header;
InFile.Read(ReadBytes, 0, 227);
fixed (byte* bHdrPtr = &ReadBytes[0])
{
Header = (LASHeader*)bHdrPtr;
//now Header and ReadBytes occupy the same memory
}
此时,ReadBytes
的任何更改都会更改Header
,反之亦然。据我了解,fixed
语句免除了指针在fixed
块中的移动,但是现在永久的结构和字节将占据相同的内存,或者内部内存管理分别移动/重新排列地址?即我可以信任fixed
块之后的结构来指向相同的有意义的内存,而不是成为随机字节或全0吗?
以前,我同时声明了bytes[227]
和MyStruct
并使用Buffer.BlockCopy
将字节从数组复制到结构中。这效率极低,需要两倍的内存和一个每次读取新字节时进行块复制,因此我希望像在C ++中那样重铸字节以节省内存并希望加快处理速度。
答案 0 :(得分:1)
,但是结构和字节现在将永久占据相同的位置 记忆
fixed
的{{3}}状态:
执行该语句中的代码后,所有固定变量都将 取消固定并进行垃圾回收。因此,不要指向 固定语句之外的那些变量。在中声明的变量 固定语句仅限于该语句
这样,否-更改不是永久-仅 在fixed
语句内。