A linear and endianness-safe approach here:
#include <stdint.h>
#include <stdio.h>
#include <arpa/inet.h> /* for ntohs() */
union Convert
{
uint16_t to_integer_big_endian;
uint8_t barr[sizeof (uint16_t)];
};
uint16_t pick_and_convert(uint8_t * barr, size_t s, size_t n)
{
union Convert c = {0}; /* Take out-of-bound bytes as 0s. */
for (size_t i = 0; i < sizeof c.barr && (n + i) < s; ++i)
{
c.barr[i] = barr[n + i];
}
return ntohs(c.to_integer_big_endian);
}
int main(void)
{
uint8_t barr[4] = {1, 2, 3, 4}; /* Assuming a binary sequence. */
size_t n;
scanf("%zu", &n);
uint16_t to_integer = pick_and_convert(barr, sizeof barr / sizeof *barr, n);
printf("result = 0x%hx\n", to_integer);
}