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;
}
}