c++ - 以下场景如何复制?

标签 c++ visual-c++ shared-memory memcpy

我有一个内存映射文件 和相应的MapViewOfFile 句柄。 内存映射文件将包含两部分数据:

  1. unsigned int 指定实际数据的长度
  2. 实际相关数据

例如如果我的实际数据的长度是 10 个字符,内存映射文件将是这样的:

10
abcdefghij

其中 abcdefghij 是我想要的数据,并且会有一个换行符 b/w 长度数字和数据。如果需要,我也可以自由使用任何其他分隔符。

现在我想先读取unsigned int,以便能够读取实际数据。我正在考虑 memcpy 但我不确定如何才能获得准确的 unsigned int 值,因为我认为 memcpy 逐字符复制。如何从内容中提取 10

最佳答案

你可以这样做:

#include "windows.h"
#include <iostream>

int main() {
    const size_t buffer_size = 4098;
    const char* name = "my_shared_memory"; //sm name
    HANDLE file = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, buffer_size, name);
    LPVOID region = MapViewOfFile(file, FILE_MAP_ALL_ACCESS, 0, 0, buffer_size);

    const char* const msg = "this is my data"; //this is the string you want to pass
    const int msg_size = strlen(msg) + 1; //this is the size of the string data with \0
    const int total_size = msg_size + sizeof(int); //the total size of your data: the size of the string and the string by itself
    char* const data = (char*)malloc(total_size); //get some memory to place this data
    ((int*)data)[0] = msg_size; //set the first part of the data with the string msg size
    memcpy(data + sizeof(int), msg, msg_size); //set the msg by it self just after the size

    CopyMemory(region, data, total_size); //put on sm

    const int retrieved_size = ((int*)region)[0]; //retrieves the size of the msg from the sm
    char* const retrieved_msg = (char*)malloc(retrieved_size); //alloc some space for receive the msg with the retrieved size
    memcpy(retrieved_msg, (char*)region + sizeof(int), retrieved_size); //set the msg in the previous allocated memory
    std::cout << retrieved_msg << std::endl; //prints the msg

    free(data);
    free(retrieved_msg);
}

在此question您有一些解决方案来检查字节序。然后,如果需要,您可以再使用一个字节来存储此信息。如果字节顺序不同,您可以 swap bytes .


Josh 评论的解决方案:

对于 ASCII 编码的大小,您可以将其作为字符串保存,而不是将 int 二进制编码的大小存入内存:

const int max_digits_size = 3;
char number[max_digits_size + 1];
sprintf(number, "%d", msg_size);
//your total_size is now (max_digits_size + 1) + msg_size

//first you retrieve from sm the number as string in number_memcopied var, then you convert:
const int retrieved_size = strtol(number_memcopied, NULL, 10);

关于c++ - 以下场景如何复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58011965/

相关文章:

c++ - 无法链接到库...VS 2010 lib

c++ - std::greater<int>() 与 partial_copy_sort 比较器的困难,Mac OSX 上的 "no matching function call.."

visual-studio - 热门 Visual Studio 2010 C/C++ 扩展

c++ - Eigen (v141) 中的内部编译器错误

unix - 信号量的简单测试

c++ - 将 char 转换为 bool(将 bool 传递给 main)

c++ - 如何重绘QTreeWidget?

c++ - MFC中获取最近文件列表的方法

c - IPC V 客户端/服务器应用程序,具有共享内存和一个文件作为数据库,用 C 语言编写

c++ - 游戏消息传递系统的选项