#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
. Программисту-отборщику не нужно выбирать между корректностью и эффективностью… но часто приходится.