我正在尝试从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 ++中完美运行。我为文本墙道歉。