将读取C ++代码的二进制文件移植到C#

时间:2018-05-04 12:54:22

标签: c# c++ struct binaryfiles

我正在尝试从C ++应用程序中移植一些代码,以确保许可证文件与这两个应用程序兼容。

我已经尝试将这些功能标记为外部功能,但是这打开了另外一种我不想深入研究的蠕虫,考虑到这是我现在的雇主的最后一周。

我想要移植的C ++代码如下:

std::fstream licenceFile(filePath, std::ios::in | std::ios::binary);
licenceFile.read((char *) &this->m_FileData, sizeof(this->m_FileData));

m_FileData是一个结构,如下所示:

struct LicManKeyFileData
{
    BYTE m_EncryptedKey[255];
    WCHAR m_MacAddress[33];
    WCHAR m_PreviousMacLicense[33];
    WCHAR m_SoftwareName[16];
    WCHAR m_ClientName[65];
    BYTE m_Version;
    BYTE m_EncryptionLength;
    time_t m_LicenseTime;
};

我尝试了几种在C#中复制它的方法,首先按成员读取文件成员,例如:

BinaryReader reader = new BinaryReader(licenceFileStream, Encoding.BigEndianUnicode);

licenceFileData.EncryptedKey = reader.ReadBytes(licenceFileData.EncryptedKey.Length);

byte[] mac = new byte[sizeof(char) * licenceFileData.MacAddress.Length];
mac = reader.ReadBytes(mac.Length);

我注意到这个方法的一些奇怪之处在于,当在C ++应用程序中正确读取这些值时,很多值被设置为204,所以我不得不添加:

if (mac[0] == 204)
    mac[0] = 0;

这对我来说没有任何意义,它不是对齐问题,从字母之前或之后读取完全给出垃圾值(中文字符),并且检查并将0分配给第一个索引允许我获得正确的值。

我尝试过的另一种方法是在StackOverflow上找到的,如下所示:

 public static T ReadStruct<T>(this BinaryReader reader) where T : struct
 {
     Byte[] buffer = new Byte[Marshal.SizeOf(typeof(T))];
     reader.Read(buffer, 0, buffer.Length);
     GCHandle handle = default(GCHandle);

     try
     {
        handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
        return (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
     }
     finally
     {
        if (handle.IsAllocated)
            handle.Free();
     }
 }

奇怪的是,此方法还返回一些值为204,其中C ++应用程序将它们作为正确的值读取。

我在C#中使用的结构如下所示:

unsafe struct LicenceFileDataS
{
    internal fixed byte m_EncryptedKey[255];
    internal fixed char m_MacAddress[33];
    internal fixed char m_PreviousMacLicense[33];
    internal fixed char m_SoftwareName[16];
    internal fixed char m_ClientName[65];
    internal byte m_Version;
    internal byte m_EncryptionLength;
    internal long m_LicenseTime;
}

有没有人知道更好的移植此代码的方法,或者我如何将正在读取的值修复为204?它在C ++中完美运行。我为文本墙道歉。

0 个答案:

没有答案