我一直致力于将旧的 C++ 应用程序移植到 C#,但我不确定我的解决方案是否真的可行。
最令人头疼的是该应用程序的文件格式基本上只是一些(相当大的)结构转储到文件中。有趣的部分是格式要求整数以大端顺序排列,无论系统如何。因此,我拼凑了一种实用方法来翻转字节顺序,并使用大量固定大小的缓冲区构建了复制 C++ 布局的结构。此时导入就像将文件复制到内存并使用Marshal.PtrToStructure一样简单,这比手动读取要容易得多,但不会让我在构建时翻转字节顺序。
因此,格式在很大程度上取决于短变量,无论是单独的还是固定缓冲区中的。在将许多固定语句组合在一起以固定缓冲区以进行翻转的过程中,我有一个令人不安的想法。
除非我弄错了,否则只固定一个缓冲区会导致整个结构被固定(将结构的一部分从其余部分重新定位是没有意义的)。所以,我尝试过这样的事情:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public unsafe struct Example
{
short value1;
fixed short value2[10];
short value3;
fixed short value4[20];
public void FlipEndianness()
{
fixed (short* ptr = &value1)
{
Utility.FlipShorts(ptr, 32);
}
}
}
这个想法是该实用程序方法适用于指针和计数,就像它是一个数组一样遍历指针 - 我最初编写它是为了翻转缓冲区,但我在这里看到了值。从理论上讲,它似乎工作正常 - 所有变量都在一次调用中翻转,没有那么大惊小怪。我需要知道的是我的概念是否真的安全。手动固定所有东西将是一个巨大的痛苦——我提到过这些结构是巨大的吗?
固定一个变量是否会固定整个结构并使这种诡计成为可能,或者到目前为止我只是幸运地没有把内存弄得一团糟?到目前为止,我的测试结果是肯定的,但我不能肯定地说。我宁愿不要让我受到这种打击。