Каков аналог .Net Buffer.BlockCopy в чистом C?

#c #bytearray

#c #массивы

Вопрос:

Я переношу a .Сетевое приложение для Objective-C и нужно добавить фрагмент кода на чистом C. У меня есть массив байтов (или символов), и мне нужно скопировать количество байтов со смещением в другой массив символов. В .Net это буфер.Метод BlockCopy:

 Buffer.BlockCopy(sourceArray, sourceOffset, resultArray, resultOffset, length);
  

Как я могу сделать это на чистом C, если у меня есть два массива, значения смещений и длины? К сожалению, я недостаточно хорошо разбираюсь в чистом C, и на нем основана собственная работа с Objective-C bytearray.

Будем признательны за любую помощь.

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

1. Спасибо. Оба решения работают.

2. memmove менее эффективен, чем memcpy, и вам не нужен memmove, если ваш источник и цель не перекрываются, что, безусловно, здесь не так, если sourceArray и resultArray не идентичны.

Ответ №1:

Предполагая, что массивы действительно разные, т. Е. Нет перекрытия, вы должны использовать стандартную библиотечную функцию memcpy() для этого.

Он принимает только три аргумента:

  • Указатель назначения
  • Указатель на источник
  • Количество байтов

Вы можете вычислять указатели из базовых адресов вашего буфера и смещений. Что-то вроде этого:

 void BlockCopy(const uint8_t *source, size_t sourceOffset,
               uint8_t *result, size_t resultOffset,
               size_t length)
{
  memcpy(result   resultOffset, source   sourceOffset, length);
}
  

Конечно, все длины и смещения должны быть допустимыми, иначе вы попытаетесь перезаписать случайную память и получите неопределенное поведение.

Ответ №2:

Вы, вероятно, хотите memmove :

 memmove(resultArray   resultOffset, sourceArray   sourceOffset, length);
  

Обратите внимание, что пункт назначения находится на первом месте.

Если вы можете с уверенностью сказать, что массивы не перекрываются, вы можете использовать memcpy вместо memmove .

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

1. Если resultArray не совпадает с sourceArray в исходном коде C #, они не могут перекрываться.

2. @JimBalter согласен. Я просто подумал, что полезно упомянуть различие между memmove и memcpy . Программисту-отборщику не нужно выбирать между корректностью и эффективностью… но часто приходится.