Stimmen alle Punkte nicht, oder nur manche?
Mir fallen so aus der Ferne nur folgende mögliche Fehlerquellen auf:
1) Die Byte-Order in der Datei: Dein Code erwartet das höherwertige Byte
zuerst. Das kann tatsächlich so sein, aber Windows-typisch wäre
eigentlich Little-Endian, also niedriges Byte zuerst.
2) Die
im Array sollten "unsigned" sein, da sie sonst für die nachfolgenden
Shift und OR Operationen vorzeichenrichtig erweitert werden. Besonders
das niederwertige Byte läuft dann Amok.
3) Der Offset 32768 stimmt?
Probier das doch mal mit einer Datei aus, die nur wenige Punkte enthält,
sodass du das Ergebnis komplett überprüfen kann.