Как скопировать блок памяти, содержащий нулевой терминатор в C ++

0

Я преобразовал образ в байтовый массив в С# и отправил его по TCP на серверное приложение, написанное в C++.

Теперь я хочу скопировать этот массив байтов в другой блок памяти. Я пробовал функцию memcpy() но проблема заключается в том, что memcpy копирует блок памяти до тех пор, пока не достигнет нулевого терминатора ('\ 0'), и массив байтов содержит много нулевых терминаторов, и я хочу, чтобы они также были скопированы.

Обновить

Для простоты я конвертирую строку "Hello\0" World\0 "в С# в массив байтов, используя следующий оператор:

string s = "Hello\0"World\0";
byte[] bytes = Encoding.UTF8.GetBytes(s);

Я получаю байты в unsigned char * в C++ и копирую его в другой указатель char следующим образом:

char *chars = new char[12];
memcpy(chars , recvChar, MESSAGE_12);

но char * приводит к "Hello";

  • 2
    Ваше понимание memcpy неверно. Прочитайте en.cppreference.com/w/cpp/string/byte/memcpy. Он просто копирует количество байтов и не останавливается на \ 0.
  • 0
    То есть вы имеете в виду, что мне достаточно memcpy ()?
Показать ещё 3 комментария
Теги:
memcpy
byte

1 ответ

1
Лучший ответ

Согласно этому

Функция memcpy() не проверяет наличие конечного нулевого символа в источнике - он всегда копирует точно число байтов. Вы уверены, что это было memcpy?

Вы можете использовать что-то подобное для печати массива символов (printf завершается символом NULL):

for (int i = 0; i < 12; i++) //12 is the size of chars, I assume
{
    if (chars[i]!=NULL) //if you hit a '\0', ignore it
        printf("%c", chars[i]);
}
  • 0
    Да, я уверен. Я даже пробовал memmove (), но результат был таким же. Я не уверен, в чем может быть моя проблема.
  • 0
    @ user3530012 Вы хотите скопировать данные, полученные побайтно на стороне сервера, в новый массив / блок памяти?
Показать ещё 15 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню