以下场景如何复制?

How to copy for the following scenario?

我有一个 Memory mapped file 和相应的 MapViewOfFile 句柄。 memory mapped file 将包含两部分数据:

  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 [=10=]
    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 you have some solutions to check for endianess. Then you can use one more byte to store this information if necessary. If endianess is different, you can 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);