Как скопировать для следующего сценария? - PullRequest
1 голос
/ 19 сентября 2019

У меня есть Memory mapped file и соответствующая MapViewOfFile ручка.memory mapped file будет содержать данные в двух частях:

  1. unsigned int с указанием длины фактических данных
  2. Актуальные релевантные данные

Например, еслидлина моих фактических данных составляет 10 символов, файл сопоставления памяти будет выглядеть следующим образом:

10
abcdefghij

, где abcdefghij - данныеЯ хочу, и будет новая строка ч / б номер длины и данных.Я также могу свободно использовать любой другой разделитель, если это необходимо.

Теперь я хочу сначала прочитать unsigned int, чтобы иметь возможность прочитать фактические данные.Я думаю о memcpy, но я не уверен, как я могу получить точное значение без знака int, поскольку я думаю, что memcpy копирует символ за символом.Как я могу извлечь 10 как есть из содержимого?

Я абсолютный новичок в C ++.

1 Ответ

1 голос
/ 19 сентября 2019

Вы можете сделать так:

#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);
}

В этом вопросе у вас есть несколько решений для проверки порядка байтов.Затем вы можете использовать еще один байт для хранения этой информации, если это необходимо.Если endianess отличается, вы можете поменять местами байты .


Решение для комментария Джоша:

Для размера в кодировке 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);
...