unsigned short
peut ou non être de 2 octets. Regardons la mémoire pour votre exemple.
+---+---+---+ +---+---+---+
| | | | ... | | | |
+---+---+---+ +---+---+---+
|<-------- len bytes -------->|
Si unsigned short
est 2 octets, vous disposez d'un espace de valeur len/2
unsigned short
valeurs. Ou, plus généralement, vous avez un espace pour les valeurs len/n
unsigned short
, où n
est égal à sizeof(unsigned short)
.
Vous ne pouvez pas diffuser un unsigned char *
en unsigned char *
et vous vous attendez à ce que les choses fonctionnent de manière portable. Maintenant, pour calculer peak
, cela dépend de ce que vous essayez de faire. Si vous voulez trouver le maximum de len
unsigned char
valeurs et enregistrer que dans peak
, en boucle sur les valeurs fonctionnera:
size_t i;
unsigned short peak = 0;
for (i=0; i < len; ++i) {
if (buffer[i] > peak) {
peak = buffer[i];
}
}
Toutefois, si vous voulez « combiner » sizeof(unsigned short)
valeurs dans une valeur unsigned short
, puis votre meilleur pari serait de calculer les nombres à la main.
En supposant que len
est divisible par n
, et le stockage big-endian, vous pouvez faire quelque chose comme ça (non testé):
#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;
}
}