unsigned short
может быть или не быть 2 байта. Давайте посмотрим на память для вашего примера.
+---+---+---+ +---+---+---+
| | | | ... | | | |
+---+---+---+ +---+---+---+
|<-------- len bytes -------->|
Если unsigned short
имеет длину 2 байта, то есть пространство на сумму len/2
unsigned short
значений. Или, в более общем плане, у вас есть место для len/n
unsigned short
значений, где n
равно sizeof(unsigned short)
.
Вы не можете наложить unsigned char *
на номер unsigned char *
и ожидать, что работа будет работоспособной. Теперь, чтобы вычислить peak
, это зависит от того, что вы пытаетесь сделать. Если вы хотите, чтобы найти максимум len
unsigned char
значений, и кроме того, что в peak
, зацикливание над значениями будут работать:
size_t i;
unsigned short peak = 0;
for (i=0; i < len; ++i) {
if (buffer[i] > peak) {
peak = buffer[i];
}
}
Если, однако, вы хотите, чтобы «объединить» sizeof(unsigned short)
значения в одно unsigned short
значение, то ваш лучший выбор - рассчитать цифры вручную.
Предполагая, что len
делится на n
и большой обратный порядок байт для хранения, вы можете сделать что-то вроде этого (непроверенные):
#include <stdio.h>
#include <limits.h>
size_t factor = sizeof(unsigned short);
size_t n = len/factor;
size_t i;
unsigned short peak = 0;
if (len % factor != 0) {
fprintf(stderr, "Extra data at the end\n");
}
for (i=0; i < n; ++i) {
size_t j;
unsigned short test = 0;
for (j=0; j < factor; ++j) {
test = (test << CHAR_BIT) + buffer[i*factor+j];
}
if (test > peak) {
peak = test;
}
}