Самый легкий способ повторить последовательность байтов в более крупный буфер в C++

Проблема решена!

Исходный код был верным, Galaxy S9 необходимо было обновить до Android 9.0 Pie, чтобы работали функции setVolume().

Следуя совету @ Dylan, я считаю, что это просто ошибка со стороны Samsung, подкрепленная тем фактом, что обновление системы было решением.

5
задан SCFrench 13 March 2009 в 01:01
поделиться

4 ответа

Я, вероятно, просто пошел бы с этим:

for (int i=0; i < N; ++i)
    memcpy(buffer + i * byte_sequence_length, byte_sequence, byte_sequence_length);

Это предполагает, что Вы имеете дело с двоичными данными и отслеживаете длину, не используя '\0' завершение.

Если Вы хотите, чтобы они были струнами до, необходимо будет выделить дополнительный байт и включить '\0' конец. Учитывая струну до и целое число, Вы хотели бы сделать это как это:

char *RepeatN(char *source, size_t n)
{
    assert(n >= 0 && source != NULL);            
    size_t length = strlen(source) - 1;
    char *buffer = new char[length*n + 1];
    for (int i=0; i < n; ++i)
        memcpy(buffer + i * length, source, length);
    buffer[n * length] = '\0';
}
12
ответ дан 18 December 2019 в 06:13
поделиться

Можно использовать алгоритм STL, Генерируйте:

MSDN: генерировать

4
ответ дан 18 December 2019 в 06:13
поделиться

Повторение буфера при предотвращении адресной арифметики с указателями:

Можно использовать станд.:: вектор <символ> или станд.:: строка для создания вещей легче для Вас. Оба из этих контейнеров могут содержать двоичные данные также.

Это решение имеет хорошие свойства что:

  • Вы не должны волноваться о нарушениях доступа к памяти
  • Вы не должны волноваться о получении размера Вашего корректного буфера
  • Можно добавить последовательности в любое время к буферу без ручных перераспределений

.

//Note this works even for binary data.
void appendSequenceToMyBuffer(std::string &sBuffer
       , const char *byte_sequence
       , int byte_sequence_length
       , int N)
{
  for(int i = 0; i < N; ++i)
      sBuffer.append(byte_sequence, byte_sequence_length);
}

//Note: buffer == sBuffer.c_str()

Альтернатива: Для двоичных данных с помощью memcpy:

buffer = new char[byte_sequence_length*N];
for (int i=0; i < N; ++i)
  memcpy(buffer+i*byte_sequence_length, byte_sequence, byte_sequence_length); 
//...
delete[] buffer;

Альтернатива: Поскольку пустой указатель завершил строковые данные с помощью strcpy:

buffer = new char[byte_sequence_length*N+1];
int byte_sequence_length = strlen(byte_sequence);
for (int i=0; i < N; ++i)
  strcpy(buffer+i*byte_sequence_length, byte_sequence, byte_sequence_length); 
//...
delete[] buffer;

Альтернатива: Если Вы заполняете буфер единственным значением:

buffer = new char[N];
memset(buffer, byte_value, N);
//...
delete[] buffer;
7
ответ дан 18 December 2019 в 06:13
поделиться

Если N, как известно, является питанием 2, можно скопировать с первой части буфера к последующим частям, увеличивание суммы скопировало каждый раз:

assert((N > 0) && ((N & (N-1)) == 0));
memcpy(buffer, byte_sequence, byte_sequence_length);
for (size_t i = 1;  i < N;  i *= 2)
    memcpy(buffer + i * byte_sequence_length, buffer, i * byte_sequence_length);

Править: Это тривиально для расширения этого для работы, когда N не является питанием 2. Вот улучшенная версия, которая удаляет все ограничения на N и также заменяет нечетное для оператора с некоторое время.

if (N > 0)
    memcpy(buffer, byte_sequence, byte_sequence_length);
size_t copied = 1;
while (copied < N)
{
    size_t tocopy = min(copied, N - copied);
    memcpy(buffer + copied * byte_sequence_length, buffer, tocopy * byte_sequence_length);
    copied += tocopy;
}
3
ответ дан 18 December 2019 в 06:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: