Копирование из массива шестнадцатеричных символов в тип char *

#c #arrays #string

#c #массивы #строка

Вопрос:

У меня есть глобальный массив шестнадцатеричных символов, подобный этому :

 static char data[9] =  {0x01, 0xF2, 0x01, 0x02, 0x05, 0xFF, 0xFE, 0x00, 0x11};
 

Я хочу скопировать этот буфер в свой массив символов, переданный из main()

 void getBuffer (char *buffer)
{
   // HOW TO COPY from 'data' to 'buffer'
}

int main()

{

   char *out = new char[9];
   getBuffer (out);

}
 

Пробовал с memcpy, strcpy, но не сработало. Похоже, мне нужно как-то форматировать в строку для копирования??
Я делаю это на стандартном C , поэтому могу std::string также использовать связанные функции.

Комментарии:

1. Я был бы очень удивлен, если memcpy бы не сработало. Пожалуйста, покажите нам memcpy используемый вами вызов.

2. Какие симптомы вы видите, которые заставляют вас думать, что это не работает?

3. Докажите нам, что memcpy не работает. Вероятно, вы просто неправильно его используете.

4. О. Возможно, вы думаете, что ваш «шестнадцатеричный» массив символов должен содержать набор печатаемых символов «0x01», «0xF2» (каждый содержит 4 символа),… У вас есть код символа 0x01, код символа 0xF2… Ни один из которых фактически не преобразуется в печатные символы. В этом заключается ваша проблема?

5. «Шестнадцатеричный» — это не какой-то особый вид числа или символа, это просто другой способ записи чисел. Ваш массив эквивалентен {1, 242, 1, 2, 5, 255, 254, 0, 17}; .

Ответ №1:

memcpy работайте нормально, используйте эту реализацию.

 #include <string.h>
#include <stdio.h>

static unsigned char data[9] = {0x01, 0xF2, 0x01, 0x02, 0x05, 0xFF, 0xFE, 0x00, 0x11};

void    getBuffer(unsigned char *buffer)
{
    memcpy(buffer, data, sizeof(data));
}

int     main(int argc, char const** argv)
{
    unsigned char   *out = new unsigned char[sizeof(data)];
    unsigned int    i = 0;

    getBuffer(out);
    while (i < sizeof(data))
    {
        printf("0x%x|", out[i]);
        i = i   1;
    }
    printf("n");
    (void)argc;
    (void)argv;
    return (0);
}
 

если у вас есть 0xf2 в вашем массиве, то это unsigned char array .

Удачи 🙂

Комментарии:

1. Я думаю, что в вашем ответе отсутствуют некоторые моменты. Но, в общем, мы оба немного спекулятивны, потому что вопрос OP не так ясен в отношении фактических требований.

2. memcpy(buffer, data, sizeof(data)); И каким образом это лучше для получения соответствия стандарту C std::copy(data, data sizeof(data),buffer); , чем, как я уже говорил, на 1-м месте?

3. @QuentinPerez Извините, мне просто пришлось понизить голос, чтобы перевесить, неосмотрительный голос за ваш ответ. На самом деле это не так уж и плохо, но ничуть не лучше. Как уже упоминалось, по крайней мере, проблема на самом деле заключается в «плохом» вопросе.

Ответ №2:

 std::copy(data, data   sizeof(data),buffer);
 

должно работать нормально для того, что вы сейчас показываете.

Пробовал с memcpy, strcpy, но не сработало. Похоже, мне нужно как-то форматировать в строку для копирования?? Я делаю это в cpp, поэтому также могу использовать функции, связанные со строками.

Я думаю, что самое важное, что вы говорите, чтобы определить ваши фактические потребности, — это то, что вы упоминаете 'i have to format to string somehow' . Да, вам нужно будет выполнить некоторое форматирование, чтобы значения ‘hex’ отображались в виде простой текстовой строки.

Вот несколько альтернатив, как правильно выполнить такое форматирование

 void getBuffer(std::ostreamamp; buffer) {
    buffer << hex << setw(2) << setfill('0');
    for(size_t i = 0; i < sizeof(data);   i) {
       if(i) {
           buffer << ", ";
       }
       buffer << "0x" << (unsigned int)data[i];
    }
}

int main() {
    getBuffer (std::cout);
    std::cout << std::endl;
}
 

Альтернативой является получение std::string возвращаемого из getBuffer() функции

 void getBuffer(std::stringamp; buffer) {
    std::ostringstream oss;
    oss<< hex << setw(2) << setfill('0');
    for(size_t i = 0; i < sizeof(data);   i) {
       if(i) {
           oss << ", ";
       }
       oss << "0x" << (unsigned int)data[i];
    }
    buffer = oss.str();
}

int main() {
    std::string out;
    getBuffer (out);
    std::cout << out << std::endl;
}
 

Или, по крайней мере, как я бы предпочел, иметь функцию, которая делает это независимо от глобальной статической переменной данных, и выбрать более полное именование

 std::string getHexBytesFormat(const char* data, size_t size) {
    std::ostringstream oss;
    oss<< hex << setw(2) << setfill('0');
    for(size_t i = 0; i < size;   i) {
       if(i) {
           oss << ", ";
       }
       oss << "0x" << (unsigned int)data[i];
    }
    return oss.str();
}

static char data[9] =  {0x01, 0xF2, 0x01, 0x02, 0x05, 0xFF, 0xFE, 0x00, 0x11};

int main() {
    std::cout << getHexBytesFormat(data,sizeof(data)) << std::endl;
}
 

Все, что касается форматирования и управления выходными (и входными) потоками, подробно объясняется в этой части стандартной документации.

Комментарии:

1. std::copy Строка вверху неверна, потому что она использует sizeof .

2. @BrianVandenberg Что плохого в использовании sizeof() для глобально доступного статического массива, например static char data[9]; , пожалуйста? Можете ли вы подробнее рассказать об этом? Обратите внимание, я сказал: «должно работать нормально для того, что вы сейчас показываете».

3. Моя ошибка, я немного поторопился с чтением кода и увидел только динамически выделяемый массив.