2010-12-12 41 views
1

J'ai un fichier binaire, la définition de son contenu est comme ci-dessous: (toutes les données sont stockées en petit boutiste (c'est-à-dire moins significatif octet en premier)). Les numéros des exemples ci-dessous sont HEXConversion HEX & Decimal

11 63 39 46    --- Time, UTC in seconds since 1 Jan 1970. 
01 00     --- 0001 = No Fix, 0002 = SPS 
97 85 ff e0 7b db 4c 40 --- Latitude, as double 
a1 d5 ce 56 8d 26 28 40 --- Longitude, as double 
f0 37 e1 42    --- Height in meters, as float 
fe 2b f0 3a    --- Speed in km/h, as float 
00 00 00 00    --- Heading (degrees ?), as float 
01 00     --- RCR, log reason. 0001=Time, 0004=Distance 
59 20 6a f3 4a 26 e3 3f --- Distance in meters, as double, 
2a      --- ? Don't know 
a8      --- Checksum, xor of all bytes above not including 0x2a 

les données du fichier binaire « dans HEX » est comme ci-dessous

"F25D39460200269652F5032445401F4228D79BCC54C09A3A2743B4ADE73F2A83" 

J'apprécie si vous pouvez me soutenir pour traduire cette ligne de données en fonction de l'instruction avant .

+0

Malgré le mauvais formatage des instructions, le contenu semble assez clair (sauf bien sûr avant-dernier octet). Quel est votre problème spécifique avec la description? – 6502

Répondre

1

Probablement pas, mais voici un coup de feu à l'aide de Ruby:

hex = "F25D39460200269652F5032445401F4228D79BCC54C09A3A2743B4ADE73F2A83" 
ints = hex.scan(/../).map{ |s| s.to_i(16) } 
raw = ints.pack('C*') 
fields = raw.unpack('VvEEVVVvE') 

p fields 
#=> [1178164722, 2, 42.2813707974677, -83.1970117467067, 1126644378, 1072147892, nil, 33578, nil] 

p Time.at(fields.first) 
#=> 2007-05-02 21:58:42 -0600 

Je vous en serais reconnaissant si quelqu'un bien versé dans #pack et #unpack me montrer une meilleure façon d'atteindre les trois premières lignes.

+0

Je ne suis pas sûr des autres valeurs, mais je suis sûr que le temps est correct. Comment avez-vous fait. Y at-il du code dans vb.net ou C# à comprendre. Merci à tous pour votre soutien . –

+0

@waleednosir 1. Convertissez chaque paire de caractères hexadécimaux en valeur entière. 2. Créez un tableau d'octets bruts à partir de tous ces entiers, en les traitant chacun comme un octet non signé. 3. Extrayez les quatre premiers octets ('V') comme un petit-boutiste non signé. 4. Traitez ceux-ci comme l'époque. – Phrogz

+0

Merci beaucoup, cela fonctionne. Merci encore . Mais je ne comprends pas comment avez-vous convertir la valeur entière 1178164722 en heure et date. Aussi, pourquoi avez-vous lu la première valeur HEX à l'envers pour la convertir en INTeger. Je veux dire que la valeur 1178164722 est la valeur décimale de 46395DF2 alors que les 4 premiers octets de mon code étaient l'inverse c'est-à-dire F25D3946. S'il vous plaît noter que vos résultats sont OK mais je ne comprends pas pourquoi. aussi, y at-il un code simple dans VB.net ou C# qui fait de belles choses. . vous l'avez résolu en 3 lignes de code seulement. c'est vraiment incroyable. –

0

Mon Cygnus Hex Editor peut charger un tel fichier et, en utilisant des modèles de structure, afficher les données dans ses formats natifs. Au-delà, c'est juste une question de faire passer chaque valeur et d'établir la traduction pour chaque octet.

+0

désolé pour le retard, je n'ai pas relégué qu'il ya Accepter ou rejeter le chemin de chaque question. C'est de ma faute . J'ai accepté vos réponses de génie et d'inspiration. Désolé pour le retard –