我使用 C++ VS2010 使用 CreateFileMapping 和 MapViewOfFile 在 Window 下映射文件。
我知道从这个映射文件中获取/读取数据的唯一方法是使用 MemCpy。但是,我希望可能有更快/更直接的方法。
有吗?如果是的话,有人可以发布一个样本吗?
谢谢!
我使用 C++ VS2010 使用 CreateFileMapping 和 MapViewOfFile 在 Window 下映射文件。
我知道从这个映射文件中获取/读取数据的唯一方法是使用 MemCpy。但是,我希望可能有更快/更直接的方法。
有吗?如果是的话,有人可以发布一个样本吗?
谢谢!
您可以将内存块作为指针转换为数据结构,
struct someStruct* data = (struct someStruct*)memAddress;
然后您可以将数据作为指针访问
somefuction (data->var1, data->var2);
或者
sum = data->var1 + data->var2;
你必须小心,并确保映射结构与内存块匹配,否则你会得到一些垃圾
像这样的东西
struct msgStructureCommon { unsigned int messageID; 无符号整数消息大小;char bufferLimit[1024-(2*sizeof(unsigned int))]; };
struct msgStructureID911
{
unsigned int messageID;
unsigned int messageSize;
//someData....
};
struct msgStructureID2013
{
unsigned int messageID;
unsigned int messageSize;
//someData....
};
// 在主
char* buffer = receiveData(socket);
struct msgStructureCommon* msgRCV = (struct msgStructureCommon*)buffer;
std::cout<< msgRCV->messageID << std::endl;
if(msgRCV->messageID == 911)
{
struct msgStructureID911* msg911 = (struct msgStructureID911*)buffer;
if(msg911->messageSize >= MSG_LIMIT_SIZE_911)
{
std::cout<< msg911->someData<< std::endl;
}
else
{
std::cout<< "ops, message is not correct!" << std::endl;
}
}
else if (msgRCV->messageID == 2013)
{
//...
}