En utilisant Python (3.1 ou 2.6), j'essaie de lire des données à partir de fichiers de données binaires produits par un récepteur GPS. Les données pour chaque heure sont stockées dans un fichier séparé, dont chacune est d'environ 18 MiB. Les fichiers de données ont plusieurs enregistrements de longueur variable, mais pour le moment je dois extraire des données d'un seul enregistrement.En utilisant Python, comment lire et extraire des données d'un fichier de données binaires avec plusieurs enregistrements de longueur variable?
Je dois aller jusqu'à décoder, en quelque sorte, l'en-tête. Je dis un peu parce que certains chiffres n'ont pas de sens, mais la plupart le font. Après avoir passé quelques jours sur ce sujet (j'ai commencé à apprendre à programmer en utilisant Python), je ne progresse pas, il est donc temps de demander de l'aide.
Le guide de référence me donne la structure d'en-tête de message et la structure d'enregistrement. Les en-têtes peuvent être de longueur variable mais sont généralement de 28 octets.
Header
Field # Field Name Field Type Desc Bytes Offset
1 Sync char Hex 0xAA 1 0
2 Sync char Hex 0x44 1 1
3 Sync char Hex 0x12 1 2
4 Header Lgth uchar Length of header 1 3
5 Message ID ushort Message ID of log 2 4
8 Message Lgth ushort length of message 2 8
11 Time Status enum Quality of GPS time 1 13
12 Week ushort GPS week number 2 14
13 Milliseconds GPSec Time in ms 4 16
Record
Field # Data Bytes Format Units Offset
1 Header 0
2 Number of SV Observations 4 integer n/a H
*For first SV Observation*
3 PRN 4 integer n/a H+4
4 SV Azimuth angle 4 float degrees H+8
5 SV Elevation angle 4 float degrees H+12
6 C/N0 8 double db-Hz H+16
7 Total S4 8 double n/a H+24
...
27 L2 C/N0 8 double db-Hz H+148
28 *For next SV Observation*
SV Observation is satellite - there could be anywhere from 8 to 13
in view.
Voici mon code pour essayer de comprendre l'en-tête:
import struct
filename = "100301_110000.nvd"
f = open(filename, "rb")
s = f.read(28)
x, y, z, lgth, msg_id, mtype, port, mlgth, seq, idletime, timestatus, week, millis, recstatus, reserved, version = struct.unpack("<cccBHcBHHBcHLLHH", s)
print(x, y, z, lgth, msg_id, mtype, port, mlgth, seq, idletime, timestatus, week, millis, recstatus, reserved, version)
Il produit:
b'\xaa' b'D' b'\x12' 28 274 b'\x02' 32 1524 0 78 b'\xa0' 1573 126060000 10485760 3545 35358
Les 3 champs de synchronisation doivent retourner Xaa x44 x12. (D est l'équivalent ascii de x44 - je suppose.)
L'ID d'enregistrement pour lequel je regarde est 274 - cela semble correct.
La semaine GPS est retournée sous 1573 - cela semble correct.
Millisecondes est retourné comme 126060000 - je me attendais 126015000.
Comment puis-je faire pour trouver les dossiers identifiés comme 274 et les extraire? (J'apprends Python, et la programmation, alors gardez en tête la réponse que vous donnez un codeur expérimenté peut être sur ma tête.)
Simplifiez votre vie. 'print (hex (x), hex (y), hex (z)' pour voir les valeurs hexadécimales.Vous n'avez donc pas besoin de deviner si 'b'D'' est' b '\ x44'' –